Сравнение и подсчет совпадающих значений двух ассоциативных массивов — PHP

#php #comparison #associative-array

#php #сравнение #ассоциативный массив

Вопрос:

Я исследовал сравнение двух ассоциативных массивов, что я смог сделать только с достаточной степенью точности. Я прочитал все похожие темы на S.O., но ни одна из них не решила или не решила проблему, с которой я столкнулся, то есть при сравнении двух ассоциативных массивов тестовые данные успешно показывают соответствующие совпадения, однако, когда я пытаюсь подсчитать количество совпадающих значений, я получаю некоторые странные результаты.

Редактировать:

 <?php
$data    = array(
    'Alpha' => array(
        'peace' => 0,
        'art' => 1,
        'trend' => 0,
        'night' => 1,
        'shop' => 0
    ),
    'Beta' => array(
        'peace' => 1,
        'art' => 1,
        'trend' => 1,
        'night' => 1,
        'shop' => 0
    ),
    'Gamma' => array(
        'peace' => 0,
        'art' => 1,
        'trend' => 1,
        'night' => 1,
        'shop' => 0
    )
);
$choices = array(
    'peace' => 0,
    'art' => 1,
    'trend' => 0,
    'night' => 1,
    'shop' => 0
);
function compare($data, $choices)
{
    foreach ($data as $city => $name)
    {
        echo $city . '<br>';
        foreach ($name as $key => $value)
        {
            ($choices[$key] === $value) ? $match = 'match' : $match = 'no';
            ($choices[$key] === $value) ? $i   : $i = 0;
            echo $key . ':' . $value . ':' . $choices[$key] . ':' . $match . '<br>';
        }
        echo 'Matches:' . $i . '<br><br>';
    }
}
compare($data, $choices);
?>
  

ВЫХОДНЫЕ ДАННЫЕ

 Format of data is as follows
-----------------------------
name of key:$data value:$choices value:is match

Alpha
peace:0:0:match
art:1:1:match
trend:0:0:match
night:1:1:match
shop:0:0:match
Matches:5

Beta
peace:1:0:no
art:1:1:match
trend:1:0:no
night:1:1:match
shop:0:0:match
Matches:2

Gamma
peace:0:0:match
art:1:1:match
trend:1:0:no
night:1:1:match
shop:0:0:match
Matches:2
  

‘Alpha’ должен возвращать 5 совпадений, что он и делает.
‘Beta’ должен возвращать 3, он возвращает 2.
‘Gamma’ должен возвращать 4, он возвращает 2.

Любая помощь будет принята с благодарностью. Заранее благодарю.

Ответ №1:

Проблема в том, как вы увеличиваете количество с помощью троичного оператора. Когда вы делаете

 ($choices[$key] === $value) ? $i   : $i = 0;
  

Он сбрасывается $i на ноль каждый раз, когда обнаруживает несоответствие.

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

 if ($choices[$key] === $value) $i  ;
  

Вы можете инициализировать $i 0 перед внутренним foreach циклом.

Комментарии:

1. Вау, я не знал, что это будет иметь такое значение. Спасибо, это сработало!