PHP 可迭代到数组或可遍历

2022-08-30 20:51:30

我很高兴 PHP 7.1 引入了可迭代伪类型

现在,虽然当只是循环访问这种类型的参数时,这很好,但是当您需要将其传递给仅接受或仅接受.例如,如果你想做一个array_diff,而你的是一个,你会得到一个.相反,如果调用采用迭代器的函数,则 如果 是 .,则会出现错误。arrayTraversableiterableTraversablearrayiterablearray

有没有类似 (NOT: ) 和 ?iterable_to_arrayiterator_to_arrayiterable_to_traversable

我正在寻找一种解决方案,可以避免在我的函数中使用条件,只是为了照顾这种差异,这并不取决于我定义自己的全局函数。

使用 PHP 7.1


答案 1

不确定这是你在寻找什么,但这是最短的方法。

$array = [];
array_push ($array, ...$iterable);

我不太确定为什么它有效。只是我发现你的问题很有趣,我开始摆弄PHP

完整示例:

<?php

function some_array(): iterable {
    return [1, 2, 3];
}

function some_generator(): iterable {
    yield 1;
    yield 2;
    yield 3;
}

function foo(iterable $iterable) {
    $array = [];
    array_push ($array, ...$iterable);
    var_dump($array);

}

foo(some_array());
foo(some_generator());

如果与函数一起工作会很好,但是因为它是一种语言结构,所以有点特别。它也不会在 assoc 数组中保留密钥。array()


答案 2

对于 php >= 7.4,这开箱即用:

$array = array(...$iterable);

查看 https://3v4l.org/L3JNH

编辑:仅当可迭代对象不包含字符串键时才有效