Объединение массива внутри многомерного массива с тем же ключом

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

$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')
);

Любая идея, почему я не получаю этот ожидаемый результат?

1

Решение

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

$result = array();

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

var_dump вывод $result это именно то, что вы ищете

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"}
}
3

Другие решения

Решение 1: Надеюсь это просто foreach чтобы получить желаемый результат

Попробуйте этот фрагмент кода здесь

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

$result=array();
foreach($where["id"] as $key => $value)
{
$result[]=array($value,$where["date"][$key]);
}

Решение 2: Здесь мы используем array_walk добиться того же результата

Попробуйте этот фрагмент кода здесь

<?php
ini_set('display_errors', 1);
$result=array();
$where = array('id'=>array(12,13,14),'date'=>array('1999-06-12','2000-03-21','2006-09-31'));

array_walk($where["id"], function($value,$key) use(&$result,&$where){
$result[]=array($value,$where["date"][$key]);
});
print_r($result);

Решение 3: Здесь мы используем array_shift на $where["date"],

Попробуйте этот фрагмент кода здесь

<?php
ini_set('display_errors', 1);
$result=array();
$where = array('id'=>array(12,13,14),'date'=>array('1999-06-12','2000-03-21','2006-09-31'));

foreach($where["id"] as $value)
{
$result[]=array($value,  array_shift($where["date"]));
}
print_r($result);
3

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

(минимальная версия php: 5.6)

Если вы удалите ключи массива (id а также date) от $where Вы можете использовать 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']));
1
По вопросам рекламы [email protected]