Мне нужно объединить (своего рода соединение) два массива с одинаковыми ключами, и в результате я хочу иметь значения первого как ключи второго:

Пример :

$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
2
Вы пробовали что-нибудь до сих пор?
 – 
waterloomatt
4 Фев 2022 в 16:42
Большинство функций array_ не учитывают ключи массива. Это означает, что вам придется использовать что-то вроде array_keys, что бесполезно.
 – 
u_mulder
4 Фев 2022 в 16:53
array_combine() является ближайшим, но он не обрабатывает объединение нескольких значений для одного и того же ключа, поэтому обычно вы получаете только 'map1' => 'value2' вместо 'map1' => ['value1', 'value2']. Поэтому я думаю, что вам, вероятно, придется написать свой собственный код для этого «слияния», если ключ уже имеет для него значение.
 – 
Patrick Janser
4 Фев 2022 в 16:58
2
foreach — наиболее эффективное решение, потому что это будет O(N) решение, и нет нужды умничать по-другому.
 – 
ikhvjs
4 Фев 2022 в 16:58
1
Решение находится в ответе ниже;)
 – 
Marwen Jelloul
4 Фев 2022 в 17:06

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