Объединить 2 ассоциативных массива путем сопоставления значения подмассива?

0

Мне нужно объединить эти 2 массива с помощью ключа aa => "value"

$array1 = array(
    "aa" => array("RM","PR","LE"),
    "bb" => array("100a","200a","300a"),
    "cc" => array("1.99b","2.99b","3.99b")
);

Второй массив может иметь дополнительные значения для каждого ключа, в этом примере обратите внимание на значение "ST" в "aa".

$array2 = array(
    "aa" => array("RM","PR","ST","LE"),
    "dd"  => array("UK","UK","UK","UK"),
    "ee" => array("123","456","000","789")
);

В итоге получится как 1 массив.

$final_array = array(
    "aa" => array("RM","PR","ST","LE"),
    "bb" => array("100a","200a",null,"300a"),
    "cc" => array("1.99b","2.99b",null,"3.99b")
    "dd"  => array("UK","UK","UK","UK"),
    "ee" => array("123","456","000","789"),
);

Результат с нулевыми значениями в соответствующих местах. Он должен обрабатываться как соединение MySQL, array_merge() и array_merge_recursive() не будут работать. Любые идеи парней? Заранее спасибо.

Теги:
arrays

3 ответа

1

Предполагая, что $array2 всегда больше $array1 а разница в количестве массивов равна 1, а сравнение между ключом 'aa'

// Get keys of each array, then merge, then get unique
$all_keys = array_unique(array_merge(array_keys($array1), array_keys($array2)));
// Get difference of 'aa' then the key
$diff_key = key(array_diff($array2['aa'], $array1['aa']));
// Set '$final_array' as equal to '$array1'
$final_array = $array1;
// Loop thru each keys
foreach ($all_keys as $key) {
    // Check if '$array1' has the key
    if (isset($array1[$key])) {
        // Check if '$array2' also has the key
        if (isset($array2[$key])) {
            // Splice array to add element of '$array2' to final array
            array_splice($final_array[$key], $diff_key, 0, $array2[$key][$diff_key]);
        } else {
            // Splice array to add empty element
            array_splice($final_array[$key], $diff_key, 0, '');
        }
    } else {
        // Add '$array2' element to '$final_array'
        $final_array[$key] = $array2[$key];
    }
}


print_r($final_array);
  • 0
    Привет @Erwin, это великолепно работает отлично, однако, может быть сценарий, при котором массив значений "aa" может быть одинаковым как для $ array1, так и для $ array2. Как я могу отдать вам должное за это, я впервые в стеке? Огромное спасибо.
  • 0
    Эмм. Если это так, как мы можем знать, где вставить нулевые значения? Это всегда на третьем элементе?
0

Попробуйте это

$len1 =  count($array1['aa']);
$len2 =  count($array2['aa']);
$final_array = array();
for($i = 0; $i < $len2; $i++){
  $final_array['aa'][$i] = $array2['aa'][$i];
  if($array2['aa'][$i] != $array1['aa'][$i]){
    $final_array['bb'][$i] = 'null';
    $final_array['cc'][$i] = 'null';
    $final_array['dd'][$i] = $array2['dd'][$i];
    $final_array['ee'][$i] = $array2['ee'][$i];

  }else{
     $final_array['bb'][$i] = $array1['bb'][$i];
     $final_array['cc'][$i] = $array1['cc'][$i];
      $final_array['dd'][$i] = $array2['dd'][$i];
    $final_array['ee'][$i] = $array2['ee'][$i];
  }
  if($array2['aa'][$i] == $array1['aa'][$i-1]){
    $final_array['bb'][$i] = $array1['bb'][$i-1];
    $final_array['cc'][$i] = $array1['cc'][$i-1];
  }
}
print_r($final_array);

Проверьте демо-версию: https://eval.in/920223

ВЫХОД:

Array
(
    [aa] => Array
        (
            [0] => RM
            [1] => PR
            [2] => ST
            [3] => LE
        )

    [bb] => Array
        (
            [0] => 100a
            [1] => 200a
            [2] => null
            [3] => 300a
        )

    [cc] => Array
        (
            [0] => 1.99b
            [1] => 2.99b
            [2] => null
            [3] => 3.99b
        )

    [dd] => Array
        (
            [0] => UK
            [1] => UK
            [2] => UK
            [3] => UK
        )

    [ee] => Array
        (
            [0] => 123
            [1] => 456
            [2] => 000
            [3] => 789
        )

)
0

попробуйте с вашей логикой

$array1 = array(
"aa" => array("RM","PR","LE"),
"bb" => array("100a","200a","300a"),
"cc" => array("1.99b","2.99b","3.99b")
);
$array2 = array(
  "aa" => array("RM","PR","ST","LE"),
  "dd"  => array("UK","UK","UK","UK"),
  "ee" => array("123","456","000","789")
);

 $arr=array_merge_recursive($array1,$array2);
 $new_arr=array();
 foreach($arr as $key=>$val){
   $new_arr[$key]=array_unique($val);
 }

 echo "<pre>";
 print_r($new_arr);
  • 0
    Вы тестируете свой код? Великобритания приходит один раз только из-за array_unique.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню