Многомерные массивы в PHP - PullRequest
2 голосов
/ 08 июля 2011

У меня проблемы с многомерными массивами в PHP.

Я предполагаю, что это должно быть просто, но мне трудно обернуть свой разум вокруг многомерности.

Массив, который у меня есть, выглядит следующим образом:

Array
(
[0] => Array
    (
        [projects_users] => Array
            (
                [project_id] => 1
            )

    )

[1] => Array
    (
        [projects_users] => Array
            (
                [project_id] => 2
            )

    )

)

Я хотел бы как-то изменить этот массив, чтобы он выглядел так, где я вижу только массив project_id:

Array
(
[0] => 1
[1] => 2
)

Извините за такой элементарный вопрос. Любые намеки или подсказки будут великолепны!

Ответы [ 3 ]

4 голосов
/ 08 июля 2011
$arr = ...
$new_arr = array();
foreach ( $arr as $el ) {
    $new_arr[] = $el['projects_users']['project_id'];
}

Или, с версией PHP> = 5.3:

$new_arr = array_map(function ($e) { return $e['projects_users']['project_id']; }, $arr);

Третий забавный способ, с reset:

$arr = ...
$new_arr = array();
foreach ( $arr as $el ) {
    $new_arr[] = reset(reset($el));
}

Производительность

Из любопытства / скуки я сравнил итеративные / функциональные стили с reset и без него.Я был удивлен, увидев, что тест 4 был победителем в каждом заезде - я думал, что array_map имел немного больше накладных расходов, чем foreach, но (по крайней мере, в этом случае) эти тесты показывают иначе! Тестовый код здесь.

$ php -v
PHP 5.3.4 (cli) (built: Dec 15 2010 12:15:07) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
$ php test.php
Test 1, Iterative - 34.093856811523 microseconds
Test 2, array_map - 37.908554077148 microseconds
Test 3, Iterative with reset - 107.0499420166 microseconds
Test 4, array_map with reset - 25.033950805664 microseconds
$ php test.php
Test 1, Iterative - 32.186508178711 microseconds
Test 2, array_map - 39.100646972656 microseconds
Test 3, Iterative with reset - 35.04753112793 microseconds
Test 4, array_map with reset - 24.080276489258 microseconds
$ php test.php
Test 1, Iterative - 31.948089599609 microseconds
Test 2, array_map - 36.954879760742 microseconds
Test 3, Iterative with reset - 32.901763916016 microseconds
Test 4, array_map with reset - 24.795532226562 microseconds
$ php test.php
Test 1, Iterative - 29.087066650391 microseconds
Test 2, array_map - 34.093856811523 microseconds
Test 3, Iterative with reset - 33.140182495117 microseconds
Test 4, array_map with reset - 25.98762512207 microseconds
0 голосов
/ 08 июля 2011

если важно, чтобы индексы совпадали, вы захотите сделать что-то вроде этого.

foreach ($orig_array as $key => $value) {
   $orig_array[$key] = $value['projects_users']['project_id'];
}
0 голосов
/ 08 июля 2011
foreach($arrays as $array){
    $new[] = $array['projects_user']['project_id'];
}

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