Перестановка многомерного массива - PullRequest
2 голосов
/ 08 марта 2012

У меня есть массив в следующем формате:

Array (
    [0] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )
    [1] => Array
        (
            [0] => d
            [1] => e
            [2] => f
        )
    [2] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
        )
    [3] => Array
        (
            [0] => 100
            [1] => 200
            [2] => 300
        )
)

Индексы в первом массиве (внешнем), т.е. 0 для имени, 1 для типа, 2 для ошибки и 3 для размера.

Я должен переставить этот массив в следующем формате:

Array
(
    [0] => Array
        (
            [name] => a
            [type] => d
            [error] => 0
            [size] => 100
        )
    [1] => Array
        (
            [name] => b
            [type] => e
            [error] => 0
            [size] => 200
        )
    [2] => Array
        (
            [name] => c
            [type] => f
            [error] => 0
            [size] => 300
        )
)

Есть ли какой-нибудь короткий способ разобраться в этом?

Ответы [ 2 ]

4 голосов
/ 08 марта 2012

Вы можете сделать это с хорошим старомодным циклом:

function extract_values($array) {

  $i = 0;
  $len = count($array[0]);
  $result = array();

  while($i++ < $len) {
    $result[] = array(
      'name' => array[0],
      'type' => array[1],
      'error' => array[2],
      'size' => array[3]
    );
  }

  return $result;
}

Если предположить, что описанный вами массив хранится в переменной с именем $my_array, вы можете преобразовать ее с помощью:

$my_array = extract_values($my_array);
3 голосов
/ 08 марта 2012

Вы можете сделать это с помощью array_map:

// $array is your array
$new_array = array_map(null, $array[0], $array[1], $array[2], $array[3]);
// Then, change keys
$new_array = array_map(function($v) {
  return array(
    'name' => $v[0],
    'type' => $v[1],
    'error' => $v[2],
    'size' => $v[3]
  );
}, $new_array);

Хотя простой цикл может быть быстрее.

РЕДАКТИРОВАТЬ: Пояснения

Первый вызов array_map, как описано здесь реорганизация массивов и изменение ключей:

Input: array('foo1', 'bar1'), array('foo2', 'bar2')
Output: array('foo1', 'foo2'), array('bar1', 'bar2')

Обратите внимание на значение null в качестве обратного вызова.

Тогда второй вызов здесь для того, чтобы изменить ключи так, как этого хотел OP, заменив индексированный массив на ассоциативный.

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