首页 > 解决方案 > 通过多个键值对合并两个数组

问题描述

我有两个数组,其中包含主城市和子城市的用户不同统计信息。

两个数组之间的区别在于其中一个具有 ofd 属性而另一个没有 ofd。另一个数组具有相同用户的其他一些统计信息,例如已交付。

所以我想在这里实现的是根据不同的主城市和子城市将用户统计数据组合到一个数组中......

阵列 1:

[310] => Array
(
    [walker_id] => 158
    [walker] => سلطان 158
    [districts] => Al Muhammadiyah, Al Hamadaniyah, Abhur Aljanubiah, Al Basatin, Al Asalah, Ar Rayyan, Abur Ash Shamaliyah,
    Al Murjan, As Salhiyah, Al Khalidiyah, Ar Rawadah, Az Zahra, Al Faisaliyah, An Nahdah, Ash Shati, Al Wahah, Al
    Khaldiyah, Al Loaloa, Ar Rabwah, An Nuzhah, An Naim, King Abdul Aziz International Airport, Ash Sheraa, Az Zomorod, Al
    Yaqoot, Al Amwaj, Al Hamra, Al Andalus, Al Aziziyah, As Samir, Al Fadeylah, Al Waha, An Nakhil, Mraykh, Ash Sharafiyah,
    Al Marwah, Abhur Al Junoobiyah, Petoromin, An Nasim, Abrug Ar Rughamah, Al Amir Abdulmajed, Jeddah Islamic Seaport, Al
    Frosya, Taibah, As Salamah, As Sarawat, Al Farouk, Ar Rewis, As Safa, Ar Rawabi, Al Baghdadiyah Al Gharbiyah, Faysalia,
    Al Salamah, Mishrifah, Thuwal, Al Masarah
    [main_city] => Jeddah
    [sub_city] => Jeddah
    [ofd] => 25
)

[311] => Array
(
    [walker_id] => 158
    [walker] => سلطان 158
    [districts] => Al Muhammadiyah, Al Hamadaniyah, Abhur Aljanubiah, Al Basatin, Al Asalah, Ar Rayyan, Abur Ash Shamaliyah,
    Al Murjan, As Salhiyah, Al Khalidiyah, Ar Rawadah, Az Zahra, Al Faisaliyah, An Nahdah, Ash Shati, Al Wahah, Al
    Khaldiyah, Al Loaloa, Ar Rabwah, An Nuzhah, An Naim, King Abdul Aziz International Airport, Ash Sheraa, Az Zomorod, Al
    Yaqoot, Al Amwaj, Al Hamra, Al Andalus, Al Aziziyah, As Samir, Al Fadeylah, Al Waha, An Nakhil, Mraykh, Ash Sharafiyah,
    Al Marwah, Abhur Al Junoobiyah, Petoromin, An Nasim, Abrug Ar Rughamah, Al Amir Abdulmajed, Jeddah Islamic Seaport, Al
    Frosya, Taibah, As Salamah, As Sarawat, Al Farouk, Ar Rewis, As Safa, Ar Rawabi, Al Baghdadiyah Al Gharbiyah, Faysalia,
    Al Salamah, Mishrifah, Thuwal, Al Masarah
    [main_city] => Jeddah
    [sub_city] => Khulais
    [ofd] => 1
)

阵列 2:

[260] => Array
(
    [walker_id] => 158
    [walker] => سلطان 158
    [main_city] => Jeddah
    [sub_city] => Jeddah
    [districts] => Al Muhammadiyah, Al Hamadaniyah, Abhur Aljanubiah, Al Basatin, Al Asalah, Ar Rayyan, Abur Ash Shamaliyah,
    Al Murjan, As Salhiyah, Al Khalidiyah, Ar Rawadah, Az Zahra, Al Faisaliyah, An Nahdah, Ash Shati, Al Wahah, Al
    Khaldiyah, Al Loaloa, Ar Rabwah, An Nuzhah, An Naim, King Abdul Aziz International Airport, Ash Sheraa, Az Zomorod, Al
    Yaqoot, Al Amwaj, Al Hamra, Al Andalus, Al Aziziyah, As Samir, Al Fadeylah, Al Waha, An Nakhil, Mraykh, Ash Sharafiyah,
    Al Marwah, Abhur Al Junoobiyah, Petoromin, An Nasim, Abrug Ar Rughamah, Al Amir Abdulmajed, Jeddah Islamic Seaport, Al
    Frosya, Taibah, As Salamah, As Sarawat, Al Farouk, Ar Rewis, As Safa, Ar Rawabi, Al Baghdadiyah Al Gharbiyah, Faysalia,
    Al Salamah, Mishrifah, Thuwal, Al Masarah
    [delivered] => 16
    [undelivered] => 3
    [returnedToowner] => 0
)

[261] => Array
(
    [walker_id] => 158
    [walker] => سلطان 158
    [main_city] => Jeddah
    [sub_city] => Khulais
    [districts] => Al Muhammadiyah, Al Hamadaniyah, Abhur Aljanubiah, Al Basatin, Al Asalah, Ar Rayyan, Abur Ash Shamaliyah,
    Al Murjan, As Salhiyah, Al Khalidiyah, Ar Rawadah, Az Zahra, Al Faisaliyah, An Nahdah, Ash Shati, Al Wahah, Al
    Khaldiyah, Al Loaloa, Ar Rabwah, An Nuzhah, An Naim, King Abdul Aziz International Airport, Ash Sheraa, Az Zomorod, Al
    Yaqoot, Al Amwaj, Al Hamra, Al Andalus, Al Aziziyah, As Samir, Al Fadeylah, Al Waha, An Nakhil, Mraykh, Ash Sharafiyah,
    Al Marwah, Abhur Al Junoobiyah, Petoromin, An Nasim, Abrug Ar Rughamah, Al Amir Abdulmajed, Jeddah Islamic Seaport, Al
    Frosya, Taibah, As Salamah, As Sarawat, Al Farouk, Ar Rewis, As Safa, Ar Rawabi, Al Baghdadiyah Al Gharbiyah, Faysalia,
    Al Salamah, Mishrifah, Thuwal, Al Masarah
    [delivered] => 0
    [undelivered] => 1
    [returnedToowner] => 0

结果要求:

[0] => Array
(
    [walker_id] => 158
    [walker] => سلطان 158
    [main_city] => Jeddah
    [sub_city] => Jeddah
    [districts] => Al Muhammadiyah, Al Hamadaniyah, Abhur Aljanubiah, Al Basatin, Al Asalah, Ar Rayyan, Abur Ash Shamaliyah,
    Al Murjan, As Salhiyah, Al Khalidiyah, Ar Rawadah, Az Zahra, Al Faisaliyah, An Nahdah, Ash Shati, Al Wahah, Al
    Khaldiyah, Al Loaloa, Ar Rabwah, An Nuzhah, An Naim, King Abdul Aziz International Airport, Ash Sheraa, Az Zomorod, Al
    Yaqoot, Al Amwaj, Al Hamra, Al Andalus, Al Aziziyah, As Samir, Al Fadeylah, Al Waha, An Nakhil, Mraykh, Ash Sharafiyah,
    Al Marwah, Abhur Al Junoobiyah, Petoromin, An Nasim, Abrug Ar Rughamah, Al Amir Abdulmajed, Jeddah Islamic Seaport, Al
    Frosya, Taibah, As Salamah, As Sarawat, Al Farouk, Ar Rewis, As Safa, Ar Rawabi, Al Baghdadiyah Al Gharbiyah, Faysalia,
    Al Salamah, Mishrifah, Thuwal, Al Masarah
    [delivered] => 16
    [undelivered] => 3
    [returnedToowner] => 0
    [ofd] => 53
)

[1] => Array
(
    [walker_id] => 158
    [walker] => سلطان 158
    [main_city] => Jeddah
    [sub_city] => Khulais
    [districts] => Al Muhammadiyah, Al Hamadaniyah, Abhur Aljanubiah, Al Basatin, Al Asalah, Ar Rayyan, Abur Ash Shamaliyah,
    Al Murjan, As Salhiyah, Al Khalidiyah, Ar Rawadah, Az Zahra, Al Faisaliyah, An Nahdah, Ash Shati, Al Wahah, Al
    Khaldiyah, Al Loaloa, Ar Rabwah, An Nuzhah, An Naim, King Abdul Aziz International Airport, Ash Sheraa, Az Zomorod, Al
    Yaqoot, Al Amwaj, Al Hamra, Al Andalus, Al Aziziyah, As Samir, Al Fadeylah, Al Waha, An Nakhil, Mraykh, Ash Sharafiyah,
    Al Marwah, Abhur Al Junoobiyah, Petoromin, An Nasim, Abrug Ar Rughamah, Al Amir Abdulmajed, Jeddah Islamic Seaport, Al
    Frosya, Taibah, As Salamah, As Sarawat, Al Farouk, Ar Rewis, As Safa, Ar Rawabi, Al Baghdadiyah Al Gharbiyah, Faysalia,
    Al Salamah, Mishrifah, Thuwal, Al Masarah
    [delivered] => 0
    [undelivered] => 1
    [returnedToowner] => 0
    [ofd]            => 1

编辑:

我的代码:

foreach($delivered as $value){

    $def[] = array(
        'walker_id' => $value->confirmed_walker,
        'walker'   => $value->walker,
        'main_city' => $value->main_city,
        'sub_city' => $value->d_city,
        'districts' => $value->districts,
        'delivered' => $value->delivered,
        'undelivered' => $value->undelivered,
        'returnedToowner' => $value->toowner,

    );
}


foreach($withCaptain as $value){
    $dataArray[] = array(
        'walker_id' => $value->walker_id,
        'walker'   => $value->walker,
        'districts' => $value->districts,
        'main_city' => $value->main_city,
        'sub_city' => $value->sub_city,
        'ofd'     => $value->ofd,
    );
}

$kv=[];
foreach($dataArray as $k => $v){
    $kv[ $v['walker_id'] ] = $k; // this is considering unique walker_id and not considering city and subcity

}

foreach($def as $k => $v){

    if(!isset($dataArray[$k]['delivered'])){
        $dataArray[$k]['delivered'] = 0;
        $dataArray[$k]['undelivered'] = 0;
    }

    if( array_key_exists( $v['walker_id'] , $kv ) ){      
        $dataArray[ $kv[$v['walker_id']] ] = array_merge( $dataArray[$kv[$v['walker_id']]] , $def[$k] );     
    }
}

想要结合 $def 和 $dataArray。它们都是不相等的数组。

所以基本上我想结合基于 walker_id、main_city 和 sub_city 的两个数组。

我尝试了各种不同的东西,但没有任何效果。我试过这个 Merge two associative arrays by same key

但是 temp 数组不考虑主城市和子城市,它只是根据 walker_id 进行梳理......

提前致谢

如果您需要更多详细信息,请告诉我。

标签: phparraysmultidimensional-array

解决方案


这将是一个简单的方法:

<?php
$withOfd = [
  310 => [
    'walker_id' => 158,
    'walker' => "158 ??????????",
    'districts' => "...",
    'main_city' => "Jeddah",
    'sub_city' => "Jeddah",
    'ofd' => 25
  ],
  311 => [
    'walker_id' => 158,
    'walker' => "158 ??????????",
    'districts' => "...",
    'main_city' => "Jeddah",
    'sub_city' => "Khulais",
    'ofd' => 1
  ]
];

$withoutOfd = [
  260 => [
    'walker_id' => 158,
    'walker' => "158 ??????????",
    'main_city' => "Jeddah",
    'sub_city' => "Jeddah",
    'districts' => "...",
    'delivered' => 16,
    'undelivered' => 3,
    'returnedToowner' => 0
  ],
  261 => [
    'walker_id' => 158,
    'walker' => "158 ??????????",
    'main_city' => "Jeddah",
    'sub_city' => "Khulais",
    'districts' => "...",
    'delivered' => 0,
    'undelivered' => 1,
    'returnedToowner' => 0
  ]
];

$result = [];
array_walk($withOfd, function($with) use ($withoutOfd, &$result) {
  array_walk ($withoutOfd, function($without) use (&$result, $with) {
    if (   $with['walker_id'] == $without['walker_id']
        && $with['main_city'] == $without['main_city']
        && $with['sub_city']  == $without['sub_city']) {
      $result[] = array_merge($with, $without);
    }
  });
});
print_r($result);

输出显然是:

Array
(
    [0] => Array
        (
            [walker_id] => 158
            [walker] => 158 ??????????
            [districts] => ...
            [main_city] => Jeddah
            [sub_city] => Jeddah
            [ofd] => 25
            [delivered] => 16
            [undelivered] => 3
            [returnedToowner] => 0
        )

    [1] => Array
        (
            [walker_id] => 158
            [walker] => 158 ??????????
            [districts] => ...
            [main_city] => Jeddah
            [sub_city] => Khulais
            [ofd] => 1
            [delivered] => 0
            [undelivered] => 1
            [returnedToowner] => 0
        )
)

更新:

由于评论和聊天中的讨论,另一个变体保留了任一数组中没有相应条目的条目:

$result = [];
array_walk($withOfd, function($with, $withKey) use (&$withOfd, &$withoutOfd, &$result) {
  array_walk ($withoutOfd, function($without, $withoutKey) use (&$withOfd, &$withoutOfd, &$result, $with, $withKey) {
    if (   $with['walker_id'] == $without['walker_id']
        && $with['main_city'] == $without['main_city']
        && $with['sub_city']  == $without['sub_city']) {
      $result[] = array_merge($with, $without);
      unset($withOfd[$withKey]);
      unset($withoutOfd[$withoutKey]);
    }
  });
});
$result = array_merge($result, $withOfd, $withoutOfd);

推荐阅读