php - Реструктурировать многомерный массив данных столбца в многомерный массив данных строки




arrays multidimensional-array (2)

У меня есть следующий ассоциативный массив данных столбца:

$where = array(
    'id'=>array(
        12,
        13,
        14
    ),
    'date'=>array(
        '1999-06-12',
        '2000-03-21',
        '2006-09-31'
    )
);

Мне нужно переместить / повернуть структуру, чтобы она была массивом строк (с объединенными данными столбца, назначенными их соответствующей строке). Мне не нужны имена столбцов в результате.

Ожидаемый результат:

$comb = array(
    array(12, '1999-06-12'),
    array(13, '2000-03-21'),
    array(14, '2006-09-31')
);

Хотите увидеть причудливый трюк?

( PHP минимальная версия: 5,6 )

Если вы variadic ключи массива ( id и date ) из $where вы можете использовать функцию с variadic и написать симпатичную небольшую variadic ! И вам не нужно беспокоиться о создании каких-либо массивов result - без суеты. PHP такой отличный - большой поклонник.

Входные данные:

$where=['id'=>[12,13,14],'date'=>['1999-06-12','2000-03-21','2006-09-31']];

Метод № 1: переменная array_map () с помощью func_get_args ()

$comb=array_map(function(){return func_get_args();},...array_values($where));
var_export($comb);

Этот метод является надежным, поскольку он будет обрабатывать переменное количество «строк» ​​и «столбцов». Вот демо с несколькими примерами .

Или, если вы ниже 5.6, вы можете использовать это, но оно менее гибкое / устойчивое (более буквальное к образцу данных OP):

Метод № 2: array_map () с двумя входами

$comb=array_map(function($v1,$v2){return [$v1,$v2];},$where['id'],$where['date']);
var_export($comb);

Вывод из любого метода:

array (
  0 => 
  array (
    0 => 12,
    1 => '1999-06-12',
  ),
  1 => 
  array (
    0 => 13,
    1 => '2000-03-21',
  ),
  2 => 
  array (
    0 => 14,
    1 => '2006-09-31',
  ),
)

Я считаю, что array_map() - моя любимая функция для этого случая, поскольку она создает массив результатов в той же строке (в отличие от возврата результата true / false, такого как array_walk (); или использования цикла foreach и печати после того, как это сделано). , Это означает, что вы можете сделать настоящую однострочную печать, не объявляя переменную результата ...

var_export(array_map(function(){return func_get_args();},...array_values($where)));

или же

var_export(array_map(function($v1,$v2){return [$v1,$v2];},$where['id'],$where['date']));

Хотите увидеть "причудливый", сделанный "schmancy"?

( Demo )

$where = [
    'id' => [12,13,14],
    'date'=>['1999-06-12','2000-03-21','2006-09-31']
];
var_export(array_map(null, ...array_values($where)));

Это тот же эффект, что и выше, только с более лаконичным синтаксисом.

Если кто-то пытается решить, какое решение использовать для своего собственного проекта, итеративный вызов array_column() Алекса превосходит Sahil, IMO, потому что он более гибкий / надежный (не требует жесткого кодирования всех имен столбцов), мгновенно расширяемый, если ваш ввод массив имеет переменный столбец и в целом более лаконичен и выразителен.

В этом отношении мой последний фрагмент (schmancy) также подходит для переменных входных размеров и очень лаконичен. Основное различие между Алексом и моим заключается в создании null элементов-заместителей.


Как сказал Крис Руф в своем удаленном ответе, array_column действительно более элегантный способ. Просто обязательно поместите его в какой-то цикл foreach , подобный тому, что Сахиль Гулати показал вам. Например, вот так:

$result = array();

foreach($where['id'] as $k => $v)
{
  $result[] = array_column($where, $k);
}

var_dump переменной $result var_dump - это именно то, что вы ищете

array(3) {
  [0]=>
  array(2) {
    [0]=>
    int(12)
    [1]=>
    string(10) "1999-06-12"
  }
  [1]=>
  array(2) {
    [0]=>
    int(13)
    [1]=>
    string(10) "2000-03-21"
  }
  [2]=>
  array(2) {
    [0]=>
    int(14)
    [1]=>
    string(10) "2006-09-31"
  }
}




array-column