Мне нужно объединить (своего рода соединение) два массива с одинаковыми ключами, и в результате я хочу иметь значения первого как ключи второго:
Пример :
$keyArray = [
"key1" => "map1",
"key2" => "map1",
"key3" => "map2",
"key4" => "map3"
];
$valuesArray = [
"key1" => "value1",
"key2" => "value2",
"key3" => "value3",
"key4" => "value3"
];
// ожидаемый результат :
$mappedResultArray =
[
"map1" => [
"value1",
"value2"
],
"map2" => [
"value3"
],
"map3" => [
"valu3"
],
];
Я знаю, что это возможно, используя php loops/foreach через оба массива, но я хочу иметь решение, использующее функции PHP array_* (array_map, array_merge....)
-1
Marwen Jelloul
4 Фев 2022 в 16:34
3 ответа
Лучший ответ
Вы можете сделать это, используя array_walk с замыканием, см. пример ниже:
$keyArray = [ "key1" => "map1", "key2" => "map1", "key3" => "map2", "key4" => "map3" ];
$valueArray = [ "key1" => "value1", "key2" => "value2", "key3" => "value3", "key4" => "value3" ];
function getMergeByKeys($keyArray, $valueArray) {
$mapped = [];
array_walk(
$keyArray,
function($key, $value) use ($valueArray, &$mapped) {
$mapped[$key][] = $valueArray[$value];
});
return $mapped;
}
print_r(getMergeByKeys($keyArray, $valueArray));
Это приведет:
Array
(
[map1] => Array
(
[0] => value1
[1] => value2
)
[map2] => Array
(
[0] => value3
)
[map3] => Array
(
[0] => value3
)
)
2
Mohamed23gharbi
4 Фев 2022 в 16:59
1
Хорошее решение! Это аккуратно. Но, наконец, я погуглил и использование foreach кажется еще быстрее.
– Patrick Janser
4 Фев 2022 в 17:02
1
Вверх ! спасибо @Mohamed23gharbi!
– Marwen Jelloul
4 Фев 2022 в 17:05
1
Это хорошее решение, но все же слишком сложное для работы, которую можно выполнить с помощью простого foreach...
– Angel Deykov
4 Фев 2022 в 17:15
Простой foreach - это то, что вам нужно
$keyArray = [
"key1" => "map1",
"key2" => "map1",
"key3" => "map2",
"key4" => "map3"
];
$valuesArray = [
"key1" => "value1",
"key2" => "value2",
"key3" => "value3",
"key4" => "value3"
];
$newArr = [];
foreach( $keyArray as $key => $value ){
$newArr[$value][] = $valuesArray[$key];
}
print_r($newArr);
Это приводит к:
Array
(
[map1] => Array
(
[0] => value1
[1] => value2
)
[map2] => Array
(
[0] => value3
)
[map3] => Array
(
[0] => value3
)
)
0
Angel Deykov
4 Фев 2022 в 17:09
$keys = [ "key1" => "map1", "key2" => "map1", "key3" => "map2", "key4" => "map3" ];
$values = [ "key1" => "value1", "key2" => "value2", "key3" => "value3", "key4" => "value3" ];
$result = array_reduce(
array_merge_recursive($keys, $values),
function ($carry, $item) {
$carry[$item[0]][] = $item[1];
return $carry;
}, []
);
print_r($result);
0
lukas.j
4 Фев 2022 в 17:19
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.
array_
не учитывают ключи массива. Это означает, что вам придется использовать что-то вродеarray_keys
, что бесполезно.array_combine()
является ближайшим, но он не обрабатывает объединение нескольких значений для одного и того же ключа, поэтому обычно вы получаете только'map1' => 'value2'
вместо'map1' => ['value1', 'value2']
. Поэтому я думаю, что вам, вероятно, придется написать свой собственный код для этого «слияния», если ключ уже имеет для него значение.foreach
— наиболее эффективное решение, потому что это будетO(N)
решение, и нет нужды умничать по-другому.