Как подсчитать и суммировать вхождения в каждом столбце массива? - PullRequest
0 голосов
/ 18 июня 2020

Я хочу попытаться вычислить общее количество вхождений для каждого «столбца цифр» в следующем списке чисел.

8353
1619
6889
3850
7596
9594
2557
8838
6224
7075

Мой ожидаемый результат для первых цифр:

array (
    8 => 2,  // 1st and 8th number starts with 8
    1 => 1,  // 2nd number
    6 => 2,  // 3rd and 9th
    3 => 1,  // 4th
    7 => 2,  // 5th and 10th
    9 => 1,  // 6th
    2 => 1,  // 7th
)

Мне нужны такие же вычисления для других столбцов (2-я цифры, 3-е цифры, 4-е цифры), все собранные в многомерный массив.

То, что я сделал до сих пор, было примерно таким

while($rowny = mysqli_fetch_assoc($mulai)) {
    $rowData[] = $rowny;
}
for($i=0; $i<100; $i++){
    $hasil[] = $rowData[$i]['result'];

    $pecah = str_split($hasil[$i],1);
    $hitunga = array_count_values($pecah);

    print_r($hitunga);echo "<br/>";
}

Пока что, когда я печатаю $hitunga, он показывает такой массив

Array ( [8] => 1 [3] => 2 [5] => 1 )
Array ( [1] => 2 [6] => 1 [9] => 1 )
Array ( [6] => 1 [8] => 2 [9] => 1 )
Array ( [3] => 1 [8] => 1 [5] => 1 [0] => 1 )
Array ( [7] => 1 [5] => 1 [9] => 1 [6] => 1 )
Array ( [9] => 2 [5] => 1 [4] => 1 )
Array ( [2] => 1 [5] => 2 [7] => 1 )
Array ( [8] => 3 [3] => 1 )
Array ( [6] => 1 [2] => 2 [4] => 1 )
Array ( [7] => 2 [0] => 1 [5] => 1 )

, но это меняет порядок цифр, и в некоторых случаях числа в последние столбцы. Я ожидаю сохранить 4 столбца чисел и получить общее количество вхождений в каждом столбце.

Ответы [ 2 ]

1 голос
/ 18 июня 2020
  1. Разделить каждое число на массив из 4 элементов.
    (array_map('str_split', $numbers))
  2. Транспонировать новую многомерную структуру, IOW - преобразовать столбцы в строки.
    ( array_map(null, ...#1))
  3. Подсчитайте значения.
    (array_map('array_count_values', #2)

Однострочник:

array_map('array_count_values', array_map(null, ...array_map('str_split', $numbers)))

Код: ( Демо )

var_export(
    array_map(
        'array_count_values',
        array_map(
            null,
            ...array_map(
                'str_split',
                $numbers
            )
        )
    )
);

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

Код: ( Демо )

$result = [];
foreach ($numbers as $number) {
    foreach (str_split($number) as $index => $digit) {
        $result[$index][$digit] = ($result[$index][$digit] ?? 0) + 1;
    }
}
var_export($result);

Вывод (из обоих фрагментов):

array (
  0 => 
  array (
    8 => 2,
    1 => 1,
    6 => 2,
    3 => 1,
    7 => 2,
    9 => 1,
    2 => 1,
  ),
  1 => 
  array (
    3 => 1,
    6 => 1,
    8 => 3,
    5 => 3,
    2 => 1,
    0 => 1,
  ),
  2 => 
  array (
    5 => 3,
    1 => 1,
    8 => 1,
    9 => 2,
    3 => 1,
    2 => 1,
    7 => 1,
  ),
  3 => 
  array (
    3 => 1,
    9 => 2,
    0 => 1,
    6 => 1,
    4 => 2,
    7 => 1,
    8 => 1,
    5 => 1,
  ),
)
0 голосов
/ 18 июня 2020

Значительно менее элегантно и утонченно, но это может быть logi c, который вы ищете?

<code><?php
$arr = [
    8353, 1619, 6889,3850, 7596, 9594, 2557, 8838, 6224, 7075,
];

foreach ($arr as $key => $val) {
    $split = str_split($val);
    $count[] = array_count_values($split);
}

foreach ($count as $key => $value) {
    $cleanCount[] = array_values($value);
}

// careful - numbers in table must be equal length
for ($i = 0; $i < strlen($arr[0]); $i++) {
    $result[$i] = array_sum(array_column($cleanCount, $i));
}

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

Вывод (сумма значений для каждого столбца):

Array
(
    [0] => 15
    [1] => 14
    [2] => 9
    [3] => 2
)

рабочий демонстрационный

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