У меня есть многомерный массив, который я хочу преобразовать в отдельные массивы.

Исходный массив

$hos_pabsl = array(
    0 =>
    array(
        'tile_id' => '1',
        'tile_type' => '4',
        'title' => 'Introduction',
        'topicNum' => '1',
        'topicTitle' => 'Introduction',
        'subNum' => NULL,
    ),
    1 =>
    array(
        'tile_id' => '2',
        'tile_type' => '9',
        'title' => 'Beer',
        'topicNum' => '2',
        'topicTitle' => 'Beer',
        'subNum' => NULL,
    ),
    2 =>
    array(
        'tile_id' => '3',
        'tile_type' => '4',
        'title' => 'Methods of Brewing',
        'topicNum' => '2',
        'topicTitle' => 'Beer',
        'subNum' => NULL,
    ),
    3 =>
    array(
        'tile_id' => '4',
        'tile_type' => '11',
        'title' => 'Beer Styles',
        'topicNum' => '2',
        'topicTitle' => 'Beer',
        'subNum' => '',
    ),
);

Я хочу преобразовать этот массив в отдельные массивы с именем 'tile_id' , 'tile_type' , ....

Сейчас я делаю это следующим образом!

$tile_id = [];
$tile_type = [];
$title = [];
$topicNum = [];
$topicTitle= [];
$subNum = [];

foreach($hos_pabsl as $val){
    array_push($tile_id, $val['tile_id']);
    array_push($tile_type, $val['tile_type']);
    array_push($title, $val['title']);
    array_push($topicNum, $val['topicNum']);
    array_push($topicTitle, $val['topicTitle']);
    array_push($subNum, $val['subNum']);
}

Проблема 1. Является ли это наиболее эффективным (с точки зрения скорости) способом выполнения этой операции?

Проблема 2:
Индекс (или ключи) массива $hos_pabsl всегда будут последовательными. Однако моя проблема в том, что для второго массива (на уровне 2 ИЛИ $ hos_pabsl [0]) индекс (или ключи) может увеличиваться или уменьшаться.
Например. все массивы могут иметь только 2 элемента: «tile_id» и «title». ИЛИ может иметь одно дополнительное "описание" элемента. Итак, как я могу сделать вышеуказанную операцию динамической?

Чтобы решить проблему 2, я подумал об использовании array_keys для извлечения имен сначала $names = array_keys($hos_pabsl[0]), а затем использования этих имен в качестве имен массивов, таких как ${$names[0]} =[]. Опять же, я не думаю, что это правильный / эффективный способ сделать это.



Любые указания по этому поводу были бы очень признательны.

0
phpLearner 2 Май 2014 в 03:30

3 ответа

Лучший ответ

Если вы используете PHP 5.5, вы можете использовать array_column ()

$tile_id = array_column($hos_pabsl, 'tile_id');
$tile_type = array_column($hos_pabsl, 'tile_type');
... etc

Для версий PHP ранее, чем 5.5, вы можете использовать array_map ()

$tile_id = array_map(
    function ($value) { return $value['tile_id']; }, $hos_pabsl
);
$tile_type = array_map(
    function ($value) { return $value['tile_type']; }, $hos_pabsl
);
... etc
2
Mark Baker 1 Май 2014 в 23:46

Чтобы пойти с ответом Марка Бейкера, поскольку я уже набирал его:

foreach(array_keys(reset($hos_pabsl)) as $key) {
    $$key = array_column($hos_pabsl, $key);
}
1
AbraCadaver 1 Май 2014 в 23:51

С точки зрения производительности, если массив огромен с использованием for вместо foreach, он будет быстрее.

$tile_id = array();
$tile_type = array();
$title = array();
$topicNum = array();
$topicTitle = array();
$subNum = array();

$hos_pabsl_sz = count($hos_pabsl);
for ($i = 0; $i < $hos_pabsl_sz; ++$i ) {
    $tile_id[$i] = $hos_pabsl[$i]['tile_id'];
    $tile_type[$i] = $hos_pabsl[$i]['tile_type'];
    $title[$i] = $hos_pabsl[$i]['title'];
    $topicNum[$i] = $hos_pabsl[$i]['topicNum'];
    $topicTitle[$i] = $hos_pabsl[$i]['topicTitle'];
    $subNum[$i] = $hos_pabsl[$i]['subNum'];
}
-1
Manolis Agkopian 1 Май 2014 в 23:43