Как извлечь данные в массив 1 из массива 2, основываясь на определенном значении ключа? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть два массива.

$primary = array(
           [0] => array(
                     'name' => 'PPT Shop',
                     'place_id'   => '1000',
                     'category' => '220,221',
                     'address' =>
                   ),  
           [1] => array(
                     'name' => 'Meat Shop',
                     'place_id'   => '1001',
                     'category' => '220,221'
                     'address' =>
                   ),
           [2] => array(
                     'name' => 'Bikini Shop',
                     'place_id'   => '1010',
                     'category' => '100,102'
                     'address' =>
                   ),
           [3] => array(
                     'name' => 'Knife Shop',
                     'place_id'   => '1012',
                     'category' => '1,3'
                     'address' =>
                   )
)

$moredata = array(
           [0] => array(
                     'id'   => '1000',
                     'category' => '900,901'
                     'address' => '35 Lawrence Park',
                     'phone'  => '9000000099'
                   ),  
           [1] => array(
                     'id'   => '1001',
                     'category' => '909,300'
                     'address' => '39 Park Avenue',
                   ),
           [2] => array(
                     'id'   => '1010',
                     'category' => '50,45'
                     'address' => '35 Trump Park',
                     'phone'  => '8900000099'
                   )
)

Я хочу сравнить все данные $ moredata с каждым из данных $ primary и проверить, существует ли place_id из $ primary в $ moredata. Если он совпадает, то соответствующие записи этого конкретного ключа будут обновлены. Например,

$newPrimary = array(
           [0] => array(
                     'name' => 'PPT Shop',
                     'place_id'   => '1000',
                     'category' => '220,221,900,901',
                     'address' => '35 Lawrence Park',
                     'phone'  => '9000000099'
                   ),  
           [1] => array(
                     'name' => 'Meat Shop',
                     'place_id'   => '220,221,1001',
                     'category' => '220,221,909,300',
                     'address' => '39 Park Avenue',
                   ),
           [2] => array(
                     'name' => 'Bikini Shop',
                     'place_id'   => '1010',
                     'category' => '100,102,50,45'
                     'address' => '35 Trump Park',
                     'phone'  => '8900000099'
                   ),
           [3] => array(
                     'name' => 'Knife Shop',
                     'place_id'   => '1012',
                     'category' => '1,3'
                     'address' =>
                   )
)

place_id (1000) из первичный соответствует id (1000) из moredata , поэтому place_id (1000 ) из newPrimary выглядит так: -

array(
     'name' => 'PPT Shop',
     'place_id'   => '1000',
     'category' => '220,221,900,901', // the categories get concated
     'address' => '35 Lawrence Park',
     'phone'  => '9000000099'
)

Однако для place_id (1001) первичного не имеет телефонного поля, поэтому id (1001) newPrimary выглядит так: -

array(
     'name' => 'Meat Shop',
     'place_id'   => '1001',
     'category' => '220,221,909,300', 
     'address' => '39 Park Avenue',
)

place_id (1012) не имеет совпадений, поэтому оно остается неизменным.

Как создать массив, похожий на newPrimary ? Было бы лучше, если бы мы могли добавить поля из moredata к соответствующей записи из primary . Я добился того же, используя двойной цикл foreach. Я хочу добиться этого, чтобы сократить время выполнения.

foreach($primary as $key_fs => $prm)
{
    foreach($moredata as $key_place => $pc)
    {
        if($prm['place_id'] == $pc['id'])
        {
            if(isset($pc['address']) && !empty($pc['address']))
                $primary[$key_fs]['address']  = $pc['address'];


            if(isset($pc['phone']) && !empty($pc['phone']))
                $primary[$key_fs]['phone']  = $pc['phone'];

            if(isset($pc['category']) && !empty($pc['category']))
               $primary[$key_fs]['category']  .= ','.$pc['category'];

            break;
        }
    }
}

Примечание: - Два массива будут иметь одинаковый размер, но могут иметь разный порядок.

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать array_column, чтобы превратить 2 массива в многомерный массив. Используйте array_replace_recursive для объединения массивов.

Вы можете использовать array_values, если вы хотите простой массив вместо многомерного вывода.

$primary = //Your array
$moredata  = //Your array
$result = array_replace_recursive (array_column($primary, null, 'id') ,array_column($moredata, null, 'id') );
$result = array_values($result); //To convert the multidimensional array to simple array

Обновление:

Вы можете использовать array_column, чтобы создать временный массив для $moredata. Это облегчит проверку существования идентификатора. Используйте foreach для цикла по массиву. Если идентификатор существует в $moredata, просто объедините категорию.

$newMoreData = array_column($moredata, null, 'id');
$newPrimary = array();

foreach( $primary as $val ) {
    if ( isset( $newMoreData[$val['place_id']] ) ) {
        $temp = array_merge( $val, $newMoreData[$val['place_id']] );
        $temp['category'] = $val['category'] . ',' . $newMoreData[$val['place_id']]['category'];
        unset($temp['id']);
        $newPrimary[] = $temp;
    } else {
        $newPrimary[] = $val;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...