我有一个看起来像那样的数组
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',
),
[...]
);
有没有办法在第一个数组上执行而不迭代?
这将是一个很大的阵容。我正在寻找最快的方法。
答案 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-_map)慢了三分之一,所以我把它拿回去了。array_walk()
来降低痛苦。
答案 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;
}