Вот мой тестовый код:
$a = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"21"); $b = array("Peter"=>"35", "Ben"=>"21", "Joe"=>"43"); function leo_array_diff($a, $b) { $map = array(); foreach($a as $val) $map[$val] = 1; foreach($b as $val) unset($map[$val]); return array_keys($map); } print_r(leo_array_diff($a, $b)); echo "<br>"; print_r(array_diff($a, $b));
вот что он печатает:
Array ( [0] => 37 ) Array ( [Ben] => 37 )
я буду ссылаться на leo_array_diff()
:
Первый вопрос:
как вы можете видеть, peter – это тот же номер, что и хорошо. $a
ben и $b
ben разные. $a
и $b
joe разные. но это только показывает, что Бен отличается.
возможно, потому что $a
joe 21 такой же, как $b
ben, равняется 21? как я могу это изменить? peter должен соответствовать peter, ben должен соответствовать ben и т. д.
Второй вопрос:
Бен отличается, да, потому что 37 и 21, но в print_r
он показывает только Array ( [0] => 37 )
. как я могу заставить его показать Array ( [0] => 21 )
? Как отредактировать функцию и не менять ее при вызове функции?
Прежде всего, у вас есть недоразумение array_diff .
Возвращает массив, содержащий все записи из массива1, которые не присутствуют ни в одном из других массивов.
Он не возвращает индекс Joe
потому что значение 21
находится в первом массиве.
Теперь почему ваша функция не работает? Хорошо, давайте шаг за шагом.
Вот как выглядит ваша карта после вашего первого foreach:
array( '35' => '1', '37' => '1', '21' => '1' )
Затем, во втором foreach, вы перебираете массив и удаляете ключ, где значение соответствует. Таким образом, вы удаляете индекс 35
и индекс 21
поэтому остается только индекс 37. Реальная проблема здесь в том, что вы нигде не проверяете имя .
Вот альтернатива вашей функции:
function leo_array_diff($a, $b) { $map = array(); foreach($a as $name => $value){ // The name is not found in the second array // Or the value is different from the first array if(!isset($b[$name]) || $b[$name] != $value) $map[$value] = 1; } return array_keys($map); }
var_dump
будет:
array(2) { [0]=> int(37) [1]=> int(21) }
Обмен $ a и $ b
print_r (leo_array_diff ($ Ь, $ а));
Просто поменяйте массивы … первый параметр используется для отображения позиции, чтобы разность таким образом использовала значения этого массива.