подсчет многомерного массива по значению - PullRequest
0 голосов
/ 09 апреля 2019
$feetypes=[
    [30,35,50],
    [30,35],
    [30,50],
    [30,34]
];

у меня есть этот код, я хочу посчитать согласно этому значению, например, счет 30 * 4, 35 * 2, 50 * 2 и 34 * 1.

я уже пробовал:

$counts = array();
foreach ($array as $key=>$subarr) {
  // Add to the current group count if it exists
  if (isset($counts[$subarr['group']]) {
    $counts[$subarr['group']]++;
  }
  // or initialize to 1 if it doesn't exist
  else $counts[$subarr['group']] = 1;

  // Or the ternary one-liner version 
  // instead of the preceding if/else block
  $counts[$subarr['group']] = isset($counts[$subarr['group']]) ? $counts[$subarr['group']]++ : 1;
}

но моя проблема все еще там

Ответы [ 3 ]

2 голосов
/ 09 апреля 2019

Вы можете объединить все внутренние массивы в один с помощью array_merge, а затем использовать array_count_values, чтобы получить значения.

$counts = array_count_values(array_merge(...$feetypes));
0 голосов
/ 10 апреля 2019

Объединение всех подмассивов в один массив и применение функции array_count_values для получения результата

function merageAll($arr) {
  $flatArray = array();
  foreach($arr as $element) {
    if (is_array($element)) {
        $flatArray = array_merge($flatArray, merageAll($element));
    } else {
        $flatArray[] = $element;
    }
  }
  return $flatArray;
 }
 $res = array_count_values(merageAll($feetypes));

Результат

Array
(
 [30] => 4
 [35] => 2
 [50] => 2
 [34] => 1
)

Функция merage Все будет работать, если в массиве есть значения и подмассивы.

Рабочая DEMO LINK

0 голосов
/ 09 апреля 2019

Я использовал рекурсию, если значения более двух уровней.обратите внимание, что переменная $ count передается ссылкой на функцию из-за рекурсии.

<?php
$feetypes=[
    [30,35,50],
    [30,35],
    [30,50],
    [30,34]
];

$counts = array();

function countValues($arr, &$count) {
    foreach($arr as $subval) {
        if(is_array($subval)) {
            countValues($subval,$count);
        } else {
            if(isset($count[$subval])) {
                $count[$subval] += 1;
            } else {
                $count[$subval] = 1;
            }
        }
    }
}

countValues($feetypes,$counts);
print_r($counts);
...