У меня есть массив, который выглядит примерно так
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', ), [...] );
Есть ли способ сделать это без повторения первого массива? Это будет большой массив. Я ищу самый быстрый способ сделать это.
Независимо от скорости, которую можно надеяться получить с помощью array_walk, теряется с накладными расходами. Поскольку в ваших комментариях указано, что массив является результатом запроса db, вы можете просто включить значение суммирования в свой результирующий набор, добавив 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 */
с$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 */
Логически, нет, нет никакого способа сделать это без повторения родительского массива. Но вы можете сделать это менее болезненным, используя EDIT: benchmark показывает, что array_walk (или массив-_map) медленнее на треть, поэтому я беру это обратно. array_walk()
.
С простой / чистой кодовой точки зрения это решение подходит:
$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; }