Как найти количество продуктов против производителя в многомерном массиве - PullRequest
0 голосов
/ 05 июля 2019

Я создаю веб-приложение, в котором мне нужно показать общее количество продуктов для одного производителя, но мне нужно получить эти данные из многомерного массива, где несколько массивов содержат один и тот же идентификатор производителя, но представляют разные продукты

array:1 [▼
  "Concrete" => array:199 [▼
    0 => array:26 [▼
      "fav_yes" => ""
      "id" => 1440
      "name" => "Citrox 600"
      "mfg_id" => 88
    ]
    1 => array:26 [▼
      "fav_yes" => ""
      "id" => 191
      "name" => "Crackbond CSR"
      "mfg_id" => 88

    ]
    2 => array:26 [▼
      "fav_yes" => ""
      "id" => 1305
      "name" => "980 Grout & Tile Cleaner"
      "mfg_id" => 260
      "mfg_name" => "Diedrich Technologies, Inc."

    ]
"Mension" => array:199 [▼
0 => array:26 [▼
      "fav_yes" => ""
      "id" => 1361
      "name" => "C-Tar Melt"
      "mfg_id" => 260
    ]
    1 => array:26 [▼
      "fav_yes" => ""
      "id" => 1306
      "name" => "960 HD Concrete Cleaner"
      "mfg_id" => 260
]

Мне нужно показать общее число name против mfg_id после итерации по всему массиву.Ожидаемый результат - mfg_id = 2, потому что вхождение имени против mfg_id 88 - 2 раза, а для mfg_id 260 - 3, потому что количество вхождений имени для этого идентификатора равно 3.

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете использовать array_walk_recursive , чтобы посетить каждый лист,

Примечание : array_walk_recursive - это основная функция php, которая имеет собственную область видимости. Таким образом, & $ r будет хранить данные, сохраненные в нем в итерации, иначе это будет сбросить его в каждой итерации. Другими словами, «По ссылке» означает, что он ссылается на тот же выделенный блок памяти для указанной переменной.

array_walk_recursive($arr, function ($v, $k) use (&$r) {
    if ($k == 'mfg_id') { // checking if key is mfg id
        $r[$v] = (!empty($r[$v]) ? $r[$v] : 0) + 1; // increment as per value of mfg id
    }
});

Демо

Если вам нужна foreach-версия, используя array_count_values ​​,

function assc_array_count_values( $array, $key ) {
     $new_array = [];
     foreach( $array as $row ) {
         foreach($row as $temp){
            $new_array[] = $temp[$key];    
         }
     }
     return array_count_values( $new_array );
}
// count by key name 
$temp = assc_array_count_values($arr, 'mfg_id');

Демо .

Выход: -

Array
(
    [88] => 2
    [260] => 3
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...