Как объединить три массива по общему ключу в php - PullRequest
1 голос
/ 21 июня 2020

У меня есть три массива: первый массив включает идентификаторы и имя сотрудников, а второй массив имеет ежемесячный сбор с идентификаторами сотрудников, а третий массив имеет ежедневный сбор с идентификатором сотрудника и ежедневный сбор. Я хочу объединить этот массив с идентификаторами и именем и 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
        )

)

Итак, я попробовал много раз, но желаемого результата не было. пожалуйста, помогите мне, как получить желаемый результат.

1 Ответ

0 голосов
/ 21 июня 2020

Казалось, что этот ответ можно изменить или добавить функцию, которую можно было бы вызывать несколько раз, если необходимо объединить более двух массивов.

Вероятно, есть более простые способы справиться с этим с помощью функций массива, таких как 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_pu sh.

Ниже более подробно описано то, что вы пытаетесь сделать. Я тоже не тестировал это, но если вы столкнетесь с ошибками, опубликуйте свой код с возвращенными ошибками, чтобы было легче отлаживать:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...