#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. Вау, я не знал, что это будет иметь такое значение. Спасибо, это сработало!