Как создать ассоциативный массив из двух массивов?
У меня есть два массива, один для ключей, а другой для значений. Массив значений - это массив массивов.
Массив ключей:
$keyArray = array("clientId","clientName","clientAdsress","clientPhone");
Массив значений:
$valuesArray = array(
"0"=>array("1001","aaaaa","ddddddd","22222222"),
"1"=>array("1002","bbbbbb","ddddddd","11111111"),
"2"=>array("1003","ccccc","ddddddd","33333333")
);
Ожидаемый результат:
$finalData = array(
"clientId"=>array("1001","1002","1003"),
"clientName"=>array("aaaaa","bbbbbb","ccccc"),
"clientAdsress"=>array("ddddddd","ddddddd","ddddddd"),
"clientPhone"=>array("22222222","11111111","33333333")
);
Я пробовал этот код:
$finalData = array();
for($i=0;$i<count($keyArray);$i++){
for($j=0;$j<count($valuesArray);$j++){
$rowArray = $valuesArray[$j];
$finalData[$keyArray[$i]] = array($rowArray[$i]);
}
}
echo '<pre>';print_r($finalData);echo '</pre>';
Выход:
Array
(
[clientId] => Array
(
[0] => 1003
)
[clientName] => Array
(
[0] => ccccc
)
[clientAdsress] => Array
(
[0] => ddddddd
)
[clientPhone] => Array
(
[0] => 33333333
)
)
Я получаю последние значения массивов. Как я могу получить ожидаемый результат?
Ответы
Ответ 1
Один из способов сделать это с помощью array_combine
и array_column
:
$finalData = array_combine($keyArray, array(array_column($valuesArray, 0),
array_column($valuesArray, 1),
array_column($valuesArray, 2),
array_column($valuesArray, 3)));
print_r($finalData);
Выход:
Array (
[clientId] => Array ( [0] => 1001 [1] => 1002 [2] => 1003 )
[clientName] => Array ( [0] => aaaaa [1] => bbbbbb [2] => ccccc )
[clientAdsress] => Array ( [0] => ddddddd [1] => ddddddd [2] => ddddddd )
[clientPhone] => Array ( [0] => 22222222 [1] => 11111111 [2] => 33333333 )
)
Демо на 3v4l.org
Ответ 2
Простое решение foreach
:
https://3v4l.org/gbBad
<?php
$keyArray = array("clientId", "clientName", "clientAdsress", "clientPhone");
$valuesArray = array(
"0" => array("1001", "aaaaa", "ddddddd", "22222222"),
"1" => array("1002", "bbbbbb", "ddddddd", "11111111"),
"2" => array("1003", "ccccc", "ddddddd", "33333333")
);
$expected = array(
"clientId" => array("1001", "1002", "1003"),
"clientName" => array("aaaaa", "bbbbbb", "ccccc"),
"clientAdsress" => array("ddddddd", "ddddddd", "ddddddd"),
"clientPhone" => array("22222222", "11111111", "33333333")
);
$result = [];
foreach ($keyArray as $key => $keyName) {
foreach ($valuesArray as $value) {
$result[$keyName][] = $value[$key];
}
}
var_dump($result === $expected);
Выход за 7.1.25 - 7.3.2
BOOL (истина)
Ответ 3
Основываясь на ответе Ника, более простое решение, которое не требует жесткого кодирования количества ключей:
$finalData = array_combine($keyArray, array_map(null, ...$valuesArray));
(Демонстрация на 3v4l.org)
По сути, это сначала транспонирует двумерный $valuesArray
с использованием array_map
как описано в этом ответе, изменяя столбцы на строки и наоборот, а затем объединяет результат с $keyArray
с использованием array_combine
как в ответе Ника.
Ответ 4
<?php
$keyArray = array(
"clientId","clientName","clientAdsress","clientPhone"
);
$valuesArray = array(
"0"=>array("1001","aaaaa","ddddddd","22222222"),
"1"=>array("1002","bbbbbb","ddddddd","11111111"),
"2"=>array("1003","ccccc","ddddddd","33333333")
);
foreach($keyArray as $keyIndex => $keyName)
$finalData[$keyName] = array_column($valuesArray, $keyIndex);
print_r($finalData);
Выход:
Array
(
[clientId] => Array
(
[0] => 1001
[1] => 1002
[2] => 1003
)
[clientName] => Array
(
[0] => aaaaa
[1] => bbbbbb
[2] => ccccc
)
[clientAdsress] => Array
(
[0] => ddddddd
[1] => ddddddd
[2] => ddddddd
)
[clientPhone] => Array
(
[0] => 22222222
[1] => 11111111
[2] => 33333333
)
)