PHP: массив_интерсект не дает ожидаемого результата - PullRequest
2 голосов
/ 13 февраля 2020

Я пытаюсь посчитать совпадения между expected и actual в массиве PHP, у меня есть это ...

$array = array(
    "item" => array(
        'expected' => array(
            '1' => 25,
            '2' => 4,
            '3' => 4,
        ),
        'color' => 'red',
        'actual' => array(
            '1' => 25,
            '2' => 4,
            '3' => 3,
        ),
    ),
);

foreach ($array as $key => $arrayItem) {

    $matches = array (
        'matches'  => count ( array_intersect ( $arrayItem['expected'], $arrayItem['actual'] ) ),
    );

}

echo "Matches = " . $matches['matches'];

Я ожидаю, что это вернет 2, но на самом деле возвращается 3. Если я изменю значения, как в примере ниже, тогда это сработает ...

$array = array(
    "item" => array(
        'expected' => array(
            '1' => 25,
            '2' => 84,
            '3' => 4,
        ),
        'color' => 'red',
        'actual' => array(
            '1' => 25,
            '2' => 84,
            '3' => 3,
        ),
    ),
);

foreach ($array as $key => $arrayItem) {

    $matches = array (
        'matches'  => count ( array_intersect ( $arrayItem['expected'], $arrayItem['actual'] ) ),
    );

}

echo "Matches = " . $matches['matches'];

Кто-нибудь знает, почему топ-версия не дает ожидаемого результата?

Ответы [ 3 ]

3 голосов
/ 13 февраля 2020

Поскольку он возвращает массив, содержащий все значения в массиве1 , чьи значения существуют во всех параметрах.

array_intersect(array $array1, array $array2[, array $... ]): array

https://www.php.net/manual/en/function.array-intersect.php

Может быть, вы можете увидеть это ясно с этой точки зрения:

var_dump(array_intersect([25, 4, 4, 4], [25, 4, 3])); // [25, 4, 4, 4] 
// because the number `4` is in the second array!

var_dump(array_intersect([25, 4, 3], [25, 4, 4, 4])); // [25, 4]
2 голосов
/ 13 февраля 2020

Счет на самом деле правильный.

Это не происходит во втором примере, потому что вы используете цифры 84 и 4, но по сути здесь есть совпадения:

$arrayItem['expected'][1] совпадений с $arrayItem['actual'][1] ( 25 и 25 )

$arrayItem['expected'][2] совпадает с $arrayItem['actual'][2] ( 4 и 4 )

$arrayItem['expected'][3] соответствует $arrayItem['actual'][2] ( 4 и 4 )

Счет 3 правильный.


Вы можете проверить это, изменив свой код следующим образом:

$matches = array(
    'matches' => array_intersect ($arrayItem['expected'], $arrayItem['actual'])
);

var_dump($matches);

Здесь вы увидите этот вывод:

array(1) {
    ["matches"] => array(3) {
        [1]=> int(25) 
        [2]=> int(4) 
        [3]=> int(4)
    }
}
0 голосов
/ 13 февраля 2020

возвращает 2

<?php

 $array = array(
    "item" => array(
        'expected' => array(
            '1' => 25,
            '2' => 84,
            '3' => 4,
        ),
        'color' => 'red',
        'actual' => array(
            '1' => 25,
            '2' => 84,
            '3' => 3,
        ),
    ),
);

echo count(array_intersect($array['item']['expected'],$array['item']['actual']));
...