PHP Добавить элемент в каждый вложенный массив многомерного массива - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть массив, который выглядит примерно так:

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 ]

6 голосов
/ 08 декабря 2011

Независимо от скорости, которую можно надеяться получить с помощью 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

*/
3 голосов
/ 15 августа 2014

С точки зрения простого / чистого кода это решение подходит:

$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;   
}
3 голосов
/ 08 декабря 2011

Логически, нет, нет способа сделать это без итерации родительского массива. Но вы можете сделать его менее болезненным, используя array_walk(). EDIT: бенчмарк показывает, что array_walk (или array-_map) медленнее на треть, поэтому я возвращаюсь назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...