【问题标题】:How to merge three arrays according to common key in php如何根据php中的公共键合并三个数组
【发布时间】:2020-06-21 09:12:22
【问题描述】:

我有三个数组,第一个数组包括 ids 和员工姓名,第二个数组每月收集员工 id,第三个数组每天收集员工 id 和每日收集我想将这些数组与 ids 和 name 以及 dcollection 和每月收集合并但我的第一个数组 $ids 并没有在这里输出所需的输出

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => Rohit
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => Emop1
        )

    [2] => stdClass Object
        (
            [id] => 3
            [name] => Pankaj
        )

    [3] => stdClass Object
        (
            [id] => 4
            [name] => tejpal singh
        )
)

第二个数组 $q1 是

Array
(
    [0] => stdClass Object
        (
            [name] => Rohit
            [id] => 1
            [mcollecton] => 100
        )

    [1] => stdClass Object
        (
            [name] => Emop1
            [id] => 2
            [mcollecton] => 1222
        )

)

第三个数组 $q2 是

Array
(
    [0] => stdClass Object
        (
            [name] => Rohit
            [id] => 1
            [dcollecton] => 300
        )

    [1] => stdClass Object
        (
            [name] => Emop1
            [id] => 2
            [dcollecton] => 150
        )
)

到目前为止我已经尝试过

$new_array = array();
foreach($ids as $k) {
   $q1n = array("id"=>$k->id,"name"=>$k->name);
   foreach($q1 as $k1) {
       
       if($k->id==$k1->id){
           $mc = array("mc"=>$k1->mcollecton);    
           array_merge($q1n,$mc);
       }
   }
   
   foreach($q2 as $k1){
       if($k->id==$k1->id){
           $dc = array("dc"=>$k1->dcollecton);
           array_merge($q1n,$dc);
       }
   }
   
    $a = array_merge($q1n,$mc);
    $av = array_merge($q1n,$dc);
    array_push($new_array,$q1n); 
}

但是输出是这样的

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Rohit
        )

    [1] => Array
        (
            [id] => 2
            [name] => Emop1
        )

    [2] => Array
        (
            [id] => 3
            [name] => Pankaj
        )

    [3] => Array
        (
            [id] => 4
            [name] => tejpal singh
        )

)

我希望输出是这样的

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Rohit
            [mcollection] => 100
            [dcollection] => 300
        )

    [1] => Array
        (
            [id] => 2
            [name] => Emop1
            [mcollection] => 1222
            [dcollection] => 150
        )

    [2] => Array
        (
            [id] => 3
            [name] => Pankaj
            [mcollection] => 0
            [dcollection] => 0
        )

    [3] => Array
        (
            [id] => 4
            [name] => tejpal singh
            [mcollection] => 0
            [dcollection] => 0
        )

)

所以我尝试了很多次,但没有得到想要的输出。请帮助我如何获得所需的输出。

【问题讨论】:

  • 你看过这个答案了吗? stackoverflow.com/a/13669708/3103434
  • 只有两个数组
  • 您需要执行嵌套循环检查 id,其中一个数组中的 id 等于另一个。至少这是一种方法。

标签: php arrays


【解决方案1】:

似乎可以修改答案,或者放入一个函数,如果需要组合两个以上的数组,您可以多次调用该函数。

使用 array_merge 或 array_walk 之类的数组函数可能有更简洁的方法来处理这个问题,但这是我如何处理它的一般想法。我还没有测试过,但也许它很有用。

foreach($first as $key1 => $value){
    foreach($second as $key2 => $value2){
        // match the ids and check if array key exists on first array
        if($value['id'] === $value2['id'] && empty($first[$key2])){
            $first[$key][$key2] = $value2;
        }               
    }
}

编辑:根据您发布的答案与您提出的问题,您是在增加收藏编号还是只是设置它们?换句话说,为什么要使用+=?您还应该能够删除 array_merge 和 array_push。

以下内容更适合您尝试做的事情。我也没有对此进行测试,但是如果您遇到错误,请发布您的代码并返回错误,以便更容易调试:

foreach($ids as $k)
{
   $thisArray = $newArray[] = array("id"=>$k->id,"name"=>$k->name);

   foreach($q1 as $k1)
   {
       if($k->id == $k1->id && !empty($k1->mcollecton))
       {
            $thisArray['mc'] = $k1->mcollecton;
       }
   }
   
   foreach($q2 as $k2)
   {
       if($k->id == $k2->id && !empty($k2->dcollecton))
       {
            $thisArray['dc'] = $k2->dcollecton;
       }
   }
}

// This should have both new collections fields on all array items
print_r($newArray)

【讨论】:

  • 出现什么错误?我刚刚修改了我的答案,以更具体地针对您要执行的操作,但是如果您不发布错误,则很难提供帮助。
猜你喜欢
  • 2023-02-26
  • 2011-05-03
  • 1970-01-01
  • 2016-11-17
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多