Вот мой тестовый код:
$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 ($ Ь, $ а));
Просто поменяйте массивы … первый параметр используется для отображения позиции, чтобы разность таким образом использовала значения этого массива.