0

我想创建一个 PHP 数组,其中一些元素将被函数返回的数组元素替换。例如,我想创建以下数组:

$aArray = array(
    0x01, 
    0x10, 
    foo(1234), 
    0x03, 
    foo(445), 
    ...
)

foo是一个返回简单 PHP 数组的函数。我得到的是,当然,像

(
    [0] => 1
    [1] => 16
    [2] => Array
       (
         [1] => 2
         [2] => 4
       )
    [3] => 03
    [4] => Array
      ....

但我真正想做的是将函数的返回值直接包含到数组中,以创建类似:( [0] => 1 [1] => 16 [2] => 2 [3] => 4 [4] => 03 [5] => 3 ....

这是否可以以简单的方式完成,而无需使用 构造数组array_merge

PS:上面的例子不是一个有效的例子,只是展示了我想要做什么。函数的内容foo也无关紧要。

4

4 回答 4

1

这是我能做的最符合您需求的事情

$aArray = array_flat(
    0x01, 
    0x10, 
    foo(1234), 
    0x03, 
    foo(445)
);

这是array_flat.

function array_flat()
{
    $array  = func_get_args()
    $result = array();
    foreach ($array as $value) {
        is_array($value) || $value = array($value);                   
        foreach ($value as $dvalue) {
            $result[] = $dvalue;
        }
    }

    return $result;
}
于 2013-08-28T10:27:51.563 回答
0

如果您在阵列中需要它,您需要在添加时或之后管理它。

如果您想在数据可用时逐步执行此操作,则可以每次推送到数组。这是一个示例,其中有两个匿名函数,每次调用时都会推送到您的数组中:

$pushArray = function(&$array) {
    return function($item) use (&$array) {
        is_array($item) || $item = array($item);
        foreach($item as $value) {
            $array[] = $value;
        }
    };
}

$array = array();
$push = $pushArray($array);
$push(0x01);
$push(0x10);
$push(foo(1234));
...

如果你想在之后这样做,你可以通过强制转换和合并来做到这一点:

function arrayval($mixed) {
    settype($mixed, 'array');
    return $mixed;
}

$flat = call_user_func_array('array_merge', array_map('arrayval', $array));

另一种方法是稍后减少数组,这样更容易理解:

$flat = array_reduce($array, function($result, $item) {
    return array_merge((array) $result, (array) $item);
});

对于之后的一切,本网站上已经存在更多问答:

于 2013-08-28T10:26:17.607 回答
0

您可以通过引用将此数组传递给函数,并使用它在函数内部执行您将要执行的操作。

public function test(&$arr) {
    $arr[] = 1234;
}

$arr = array(1, 2, 3);
test($arr);

print_r($arr); // array(1, 2, 3, 1234);

或者您可以删除引用并正常从函数返回数组:

public function test($arr) {
    $arr[] = 1234;
    return $arr;
}

$arr = array(1, 2, 3);
$arr = test($arr);

print_r($arr); // array(1, 2, 3, 1234);
于 2013-08-28T10:21:35.200 回答
0

您需要array_merge单独的数组:

$aArray = array_merge(array(0x01, 0x10), foo(1234), array(0x03), foo(445));
于 2013-08-28T10:21:41.870 回答