如何根据特定键值从数组2中将数据提取到数组1中?

时间:2018-06-28 08:17:52

标签: php arrays foreach

我有两个数组。

$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的每个数据进行比较,并检查$ moreprim中的place_id是否存在。如果匹配,则将更新该特定键的相应记录。例如,

$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)匹配,因此 newPrimary 的> place_id(1000)如下:-

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

但是,对于primary的 place_id(1001)没有电话字段,因此newPrimary的id(1001)像这样:-

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

place_id(1012)不匹配,因此保持不变。

如何创建类似于 newPrimary 的数组?最好将 moredata 中的字段附加到 primary 中的相应记录。我使用double 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 :(得分:3)

您可以使用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制作一个临时数组。这将使检查ID是否存在变得更加容易。使用foreach遍历数组。如果$moredata上存在id,只需连接类别。

$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;
    }
}