PHP объединяет 2 массива с одинаковым значением ключа - PullRequest
0 голосов
/ 01 июля 2018

Мне интересно, как это решить. У меня есть 3 (три) массива, которые содержат вложенные значения в ключе «данные», как это:

array:3 [
  0 => array:3 [
    "status" => "Terkirim"
    "warna" => "lightgreen"
    "data" => array:12 [
      0 => 0
      1 => 0
      2 => 0
      3 => 0
      4 => 0
      5 => 0
      6 => 3
      7 => 0
      8 => 0
      9 => 0
      10 => 0
      11 => 0
    ]
  ]
  1 => array:3 [
    "status" => "Selesai"
    "warna" => "lightblue"
    "data" => array:12 [
      0 => 0
      1 => 0
      2 => 0
      3 => 0
      4 => 0
      5 => 0
      6 => 3
      7 => 0
      8 => 0
      9 => 0
      10 => 0
      11 => 0
    ]
  ]
  2 => array:3 [
    "status" => "Selesai"
    "warna" => "lightblue"
    "data" => array:12 [
      0 => 0
      1 => 0
      2 => 0
      3 => 0
      4 => 0
      5 => 0
      6 => 0
      7 => 1
      8 => 0
      9 => 0
      10 => 0
      11 => 0
    ]
  ]
]

Моя проблема заключается в том, как соединить «данные», если «статус» одинаковый?

array:3 [
  0 => array:3 [
    "status" => "Terkirim"
    "warna" => "lightgreen"
    "data" => array:12 [
      0 => 0
      1 => 0
      2 => 0
      3 => 0
      4 => 0
      5 => 0
      6 => 3
      7 => 0
      8 => 0
      9 => 0
      10 => 0
      11 => 0
    ]
  ]
  1 => array:3 [
    "status" => "Selesai"
    "warna" => "lightblue"
    "data" => array:12 [
      0 => 0
      1 => 0
      2 => 0
      3 => 0
      4 => 0
      5 => 0
      6 => 3
      7 => 1 <== the joined value 
      8 => 0
      9 => 0
      10 => 0
      11 => 0
    ]
  ]  
]

Любая помощь будет оценена ...:)

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вы можете использовать array_reduce() для объединения массива в ассоциативный массив. Используйте array_values() для преобразования ассоциативного массива в простой массив.

<code>$arr = //Your array
$result = array_values(array_reduce($arr, function($c, $v){
    if ( !isset( $c[ $v['status'] ] ) ) $c[ $v['status'] ] = $v;
    else foreach( $c[ $v['status'] ]['data'] as $key => &$val ) $val += $v['data'][$key];
    return $c;
}, array()));

echo "<pre>";
print_r( $result );
echo "
";

Это приведет к:

Array
(
    [0] => Array
        (
            [status] => Terkirim
            [warna] => lightgreen
            [data] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                    [4] => 0
                    [5] => 0
                    [6] => 3
                    [7] => 0
                    [8] => 0
                    [9] => 0
                    [10] => 0
                    [11] => 0
                )

        )

    [1] => Array
        (
            [status] => Selesai
            [warna] => lightblue
            [data] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                    [4] => 0
                    [5] => 0
                    [6] => 3
                    [7] => 1
                    [8] => 0
                    [9] => 0
                    [10] => 0
                    [11] => 0
                )

        )

)
0 голосов
/ 01 июля 2018

Вы можете сделать это так:

    $joinedArray = [];
    for ($initialArray as $array) {
        if (array_key_exists($array['status'], $joinedArray) {
            for ($joinedArray['data'] as $key, $dataElement) {
                 $joinedArray['data'][$key] = $dataElement + $array['data'][$key];
            }
        } else {
             $joinedArray[$array['status']] = $array;
        }
    }
...