PHP将元素添加到多维数组的每个子数组中

时间:2011-12-08 19:07:24

标签: php arrays multidimensional-array

我有一个看起来像那样的数组

array(
     [0] => array(
               'id' => 1,
               'title' => 'title 1',
     ),
     [1] => array(
               'id' => 10,
               'title' => 'title 10',
     ),
     [2] => array(
               'id' => 11,
               'title' => 'title 11',
     ),
     [...]
);

我想为所有子数组添加一个元素。这是我正在添加的相同元素。所以新数组看起来像:

array(
     [0] => array(
               'id' => 1,
               'title' => 'title 1',
               'type'  => 'bag',
     ),
     [1] => array(
               'id' => 10,
               'title' => 'title 10',
               'type'  => 'bag',
     ),
     [2] => array(
               'id' => 11,
               'title' => 'title 11',
               'type'  => 'bag',
     ),
     [...]
);

有没有办法在第一个数组上执行而不迭代 这将是一个很大的阵容。我正在寻找最快的方法。

3 个答案:

答案 0 :(得分:6)

无论使用array_walk可能希望获得什么样的速度,都会因功能开销而丢失。由于您在评论中声明数组是数据库查询的结果,您只需在结果集中添加bag值,方法是添加 SELECT 'bag' AS 'type' 即可你的SQL语句。

$start = 0; $end = 0;

$orig = array(
    array('id' => 1,  'title' => 'title 1'),
    array('id' => 10, 'title' => 'title 10'),
    array('id' => 11, 'title' => 'title 11')
);

// A
$start = microtime(true);
for ($a=0; $a<1000; $a++) {
    $els1 = $orig;
    array_walk($els1, function(&$val, $key){$val['type'] = 'bag';});
}
$end = microtime(true);
echo 'A: ', $end - $start,  "<br />\n";

// B
$start = microtime(true);
for ($b=0; $b<1000; $b++) {
    $els2 = $orig;
    foreach ($els2 as &$el) {
        $el['type'] = 'bag';
    }
    unset($el);
}
$end = microtime(true);
echo 'B: ', $end - $start,  "<br />\n";

/* output:

A: 0.0076138973236084
B: 0.0047528743743896

A: 0.0075309276580811
B: 0.0045361518859863

A: 0.0075531005859375
B: 0.062379837036133

A: 0.0075340270996094
B: 0.0044951438903809

A: 0.0074868202209473
B: 0.0044751167297363

A: 0.0076088905334473
B: 0.0048189163208008

*/

答案 1 :(得分:3)

逻辑上,不,没有迭代父数组就没有办法做到这一点。 但是你可以通过使用array_walk()来降低痛苦。编辑:基准测试显示array_walk(或array-_map)慢了三分之一,所以我把它拿回去了。

答案 2 :(得分:3)

从简单/干净的代码角度来看,此解决方案适合:

$orig = array(
array('id' => 1,  'title' => 'title 1'),
array('id' => 10, 'title' => 'title 10'),
array('id' => 11, 'title' => 'title 11'));

foreach($orig as $key => $value)
{
    $value['type'] = 'bag';
    $orig[$key] = $value;   
}