Есть ли в PHP функция, которая объединяет два многомерных ассоциативных массива? - PullRequest
0 голосов
/ 31 декабря 2018

Обратите внимание, спасибо всем, кто откликнулся.Извините за опоздание с ответом, я заболел, так как я отправил это, и я боюсь, что я не сделал этот пример очень ясным.Давайте попробуем еще раз:

Используя PHP, у меня есть два двумерных ассоциативных массива, которые я хочу объединить в один массив со всеми полями, см. Пример ниже

$ary_0[0]['name'] = 'Bobby', $ary_0[0]['address'] = '123 E Park Place'
$ary_0[1]['name'] = 'Chris', $ary_0[1]['address'] = '13 Bonanza Trail'
$ary_0[2]['name'] = 'Sally', $ary_0[2]['address'] = '97 West 3rd Ave.'

$ary_1[0]['name'] = 'Bobby', $ary_1[0]['phone'] = '555-555-1212'
$ary_1[1]['name'] = 'Chris', $ary_1[1]['phone'] = '222-555-1212'
$ary_1[2]['name'] = 'Sally', $ary_1[2]['phone'] = '999-555-1212'

, чтобырезультирующий массив выглядит как

$ary_2[0]['name'] = 'Bobby', $ary_2[0]['address'] = '123 E Park Place', $ary_2[0]['phone'] = '555-555-1212'
$ary_2[1]['name'] = 'Chris', $ary_2[1]['address'] = '13 Bonanza Trail', $ary_2[1]['phone'] = '222-555-1212'
$ary_2[2]['name'] = 'Sally', $ary_2[2]['address'] = '97 West 3rd Ave.', $ary_2[2]['phone'] = '999-555-1212'

Обратите внимание, что два массива уже отсортированы по имени, а поле имени является объединением двух массивов.Фактически, эти данные извлекаются из двух разнородных баз данных и не могут быть условно объединены в таблицы, но это тот эффект, который я ищу.

Есть ли в PHP функция, которая объединит эти два массива, как это?Я был по всей литературе, но не могу найти работоспособное решение, кроме грубого принуждения значений имени, чтобы найти совпадение.У кого-нибудь есть элегантное и простое решение?Я не верю, что array_merge () будет работать ...

TIA, Майк

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Позволяет переписать массив так, чтобы он был более понятным для всех, предполагая, что ваш код был просто каким-то псевдокодом, игнорируя синтаксис и повторяющиеся ошибки ключей.

$ary=[
    ['name'=>'Bobby','address'=>'123 E Park Place'],
    ['name'=>'Chris','address'=>'13 Bonanza Trail'],
    ['name'=>'Sally','address'=>'97 West 3rd Ave.'],
    ['name'=>'Bobby','phone'=>'555-555-1212'],
    ['name'=>'Chris','phone'=>'222-555-1212'],
    ['name'=>'Sally','phone'=>'999-555-1212']
];

Это даст вам почти то, что у вас сейчас есть.

Нет способа сделать это с помощью встроенной функции, это что-то слишком специфическое.Но решить эту проблему довольно просто.

$newArray=[];
foreach($ary as $key=>$val) {
    $found=false;
    foreach($newArray as $nKey=>$nVal) {
        if($nVal['name']==$val['name']) {
            $found=true;
            $newArray[$nKey]=array_merge($nVal,$val);
            break;
        }
    }
    if(!$found) $newArray[]=$val;
}

Если у вас слишком много элементов и вам нужно что-то более эффективное, вам следует перестроить массив или реализовать другой алгоритм поиска или использовать базу данных с индексами.

Обратите внимание, что нотация [] будет работать только на PHP + 5.4.

0 голосов
/ 31 декабря 2018

Поскольку они уже отсортированы по имени, вы можете сделать цикл for и использовать array_merge ?

$combined_arr = [];
for ( $i = 0; $i < count( $1 ); $i++ ) {
    combined_arr[] = array_merge( arr[0], arr[1] );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...