Как посчитать, сколько раз значение1 появляется со значением2 в ключах массива? - PullRequest
1 голос
/ 01 апреля 2020

Я не могу найти ответ на этот вопрос, независимо от того, сколько я ищу. Возможно, я просто спрашиваю это неправильно, но я надеюсь, что у кого-то здесь есть ответ для меня.

Я знаю, как считать значения в массиве, но мне нужно посчитать, как часто определенное значение появляется с определенным другое значение в ключах массива.

Я пробовал перебирать операторы 'foreach' и 'if', но просто не могу заставить его работать.

Массив I ' Работа с выглядит примерно так, упрощенно, чтобы показать только те ключи, которые мне интересны:

Array
(
    [0] => Array
        (
            [class] => 2
            [startissue] => 337
        )

    [1] => Array
        (
            [class] => 11
            [startissue] => 342
        )

    [2] => Array
        (
            [class] => 11
            [startissue] => 337
        )

    [3] => Array
        (
            [class] => 2
            [startissue] => 337
        )

)

Я хочу знать, сколько раз «класс» 2 появляется с «startissue» 337 (дважды в этом пример), и сохраните информацию ключ / значение. Результирующий массив был бы великолепен, например, так: Array

(
    [2] => Array
        (
            [337] => 2
        )

    [11] => Array
        (
            [337] => 1
            [342] => 1
        )

)

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

Любая помощь будет наиболее ценной!

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Вы можете использовать HashMap (или словарь), который хранит в качестве ключей значение class и в качестве значений другие словари, которые имеют в качестве ключей номер startissue и значения. количество случаев таких ассоциаций.

В Java это будет выглядеть примерно как Map<Integer, Map<Integer, Integer>>, где первые два целочисленных типа связаны (по порядку) с class и startissue .

Алгоритм будет описан так: вы перебираете элементы массива, и для каждого номера класса вы отображаете его в словарь, который будет содержать пару startissue number и 1 (1 случай). Если класс уже существует, вы просто ищете соответствующий словарь. Если ключ startissue существует, вы просто увеличиваете его соответствующее значение.

РЕДАКТИРОВАТЬ: Python код (аналог псевдокода):

dictionary = {}
for value in initialArray:
    if value["class"] not in dictionary:
        dictionary[value["class"]] = {}

    if value["startissue"] not in dictionary[value["class"]]:
        dictionary[value["class"]][value["startissue"]] = 1
    else:
        dictionary[value["class"]][value["startissue"]] += 1

И вы можете проверить его следующим образом:

if classValue in dictionary and startIssue in dictionary[classValue]:
    return dictionary[classValue][startIssue]
0 голосов
/ 02 апреля 2020

Хорошо, понял. Спасибо @Halex за то, что заставили меня задуматься о правильном пути. Вот мой код, за исключением проверок 'isset' и 'in_array' (чтобы избежать уведомлений), чтобы было легче видеть:

<code>$class=0;
$start=0;
$combo=array();

foreach ($giftlist as $giftlists) {

    $class = $giftlists['class'];
    $start = $giftlists['startissue'];

    if ($giftlists['class']==$class && $giftlists['startissue']==$start) {
        $combo[$class][$start]=$combo[$class][$start]+1;

    } elseif (in_array($class,$giftlists)) {
        $combo[$class][$start]=1;

    } else {
        $combo[$class][$start]=0;
    }

}

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

Вот оператор 'if' с проверками:

if ((in_array($class,$giftlists) && $giftlists['class']==$class) && (in_array($start,$giftlists) && $giftlists['startissue']==$start) && isset($combo[$class]) && isset($combo[$class][$start]) ) {
...