группировать уникальные значения в многомерном массиве - PullRequest
1 голос
/ 30 июня 2019

У меня есть массив RestroreModels

, если значение RestoreCode существует несколько раз в массиве.Основываясь на уникальном восстановлении, я хочу добавить значение TotalCharge и поместить связанную модель с этим RestoreCode в новый массив.если значение RestoreCode существует только один раз, как положено для одной модели в массиве.

$RestroreModels =  array (
    0 => 
    array (
      'TotalCharge' => '3',
      'RestoreCode' => 'FF 0',
      'Model' => 'iPhone 7',
    ),
    1 => 
    array (
      'TotalCharge' => '2',
      'RestoreCode' => 'LT 2015',
      'Model' => 'iPad Mini 2',
    ),
    2 => 
    array (
      'TotalCharge' => '2',
      'RestoreCode' => 'LT 4013',
      'Model' => 'iPhone 6',
    ),
    3 => 
    array (
      'TotalCharge' => '2',
      'RestoreCode' => 'LT 4013',
      'Model' => 'ipod touch',
    ),
    4 => 
    array (
      'TotalCharge' => '2',
      'RestoreCode' => 'P 21',
      'Model' => 'iPhone 7',
    ),
    5 => 
    array (
      'TotalCharge' => '2',
      'RestoreCode' => 'AL 2015',
      'Model' => 'iPhone 7',
    ),
    6 => 
    array (
      'TotalCharge' => '2',
      'RestoreCode' => 'AL 0',
      'Model' => 'ipod touch',
    ),
    7 => 
    array (
      'TotalCharge' => '1',
      'RestoreCode' => 'LT 2015',
      'Model' => 'iPad Mini',
    ),
    8 => 
    array (
      'TotalCharge' => '1',
      'RestoreCode' => 'LT 4005',
      'Model' => 'iPad Mini',
    ),
    9 => 
    array (
      'TotalCharge' => '1',
      'RestoreCode' => 'P 21',
      'Model' => 'iPad 5',
    ),
    10 => 
     array (
      'TotalCharge' => '1',
      'RestoreCode' => 'LT 4013',
      'Model' => 'iPhone 7+',
    )
  );


Я хочу получить такой результат

$RestroreModels  =  array (

    0 => 
     array (
      'TotalCharge' => '4',
      'RestoreCode' => 'LT 2015',
      'Model' => array ('iPad Mini 2', 'iPhone 7')
    ),
    1 => 
     array (
      'TotalCharge' => '3',
      'RestoreCode' => 'LT 4013',
      'Model' => array ('iPhone 7+', 'ipod touch', 'iPad Mini 2')
    ),
    2 => 
    array (
      'TotalCharge' => '3',
      'RestoreCode' => 'P 21',
      'Model' => array ('iPad Mini 2', 'iPhone 7', 'iPad 5')
    ),
    3 => 
    array (
      'TotalCharge' => '2',
      'RestoreCode' => 'AL 2015',
      'Model' => array ('iPhone 7'), 
    ),
    4 => 
    array (
      'TotalCharge' => '2',
      'RestoreCode' => 'AL 0',
      'Model' => array ('ipod touch'), 
    ),
    5 => 
    array (
      'TotalCharge' => '1',
      'RestoreCode' => 'LT 4005',
      'Model' => array ('iPad Mini'), 
    ),
  );

Я пробовал это до сих пор, я могучтобы получить уникальные значения, но не уверен, как добавить add TotalCharge и поместить модель, связанную с RestoreCode, в $ final_array.

$final_array = array();
$keys_array = array();

foreach ($RestroreModels as $key => $value) {
    if (!in_array($value['RestoreCode'], $keys_array)) {
        $keys_array[$key]       =  $value['RestoreCode'];
        $final_array[$key]      =  $value;
    }

}



var_dump ($final_array);
die();

1 Ответ

1 голос
/ 30 июня 2019

Принимая во внимание примечание if the RestoreCode value exist only once put as it is with single model in array, я думаю, вы могли бы использовать цикл foreach и сохранить RestoreCode одного массива в качестве ключа в массиве результатов. Обратите внимание, что результат будет отличаться от желаемого результата, так как элемент с одним RestoreCode также будет в результате.

Для каждой итерации проверяется, существует ли этот ключ. Если это не так, добавьте его и поместите значение для Модели в новый массив.

Если он существует, добавьте значения для TotalCharge. Чтобы получить уникальные значения для моделей, убедитесь, что текущий массив для Model уже содержит его.

Если вы хотите сбросить ключи, вы можете использовать array_values ​​.

$res = [];

foreach ($RestroreModels as $item) {
    if (isset($res[$item["RestoreCode"]])) {
        if (!in_array($item["Model"], $res[$item["RestoreCode"]]["Model"], true)) {
            $res[$item["RestoreCode"]]["Model"][] = $item["Model"];
        }
        $res[$item["RestoreCode"]]["TotalCharge"] += $item["TotalCharge"];

    } else {
        $item["Model"] = [$item["Model"]];
        $res[$item["RestoreCode"]] = $item;
    }
}

print_r(array_values($res));

Php demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...