Intereting Posts
php xpath оценить дубликаты данных, получить только первую строку swagger-php имеет разные документы из одного и того же кода Службы приложений и API Google Analytics V3: ошибка 101 (сеть :: ERR_CONNECTION_RESET) Magento – добавить пользовательский блок с помощью настраиваемого модуля на странице корзины покупок Максимальная длина строки preg_match_all может совпадать и получить? Проверьте, может ли пользователь facebook отправлять сообщения на стене своих друзей или нет сохранение / получение адресов IPv4 и IPv6 в MySQL Как вернуть данные JSON из php MongoCursor Как UPDATE и SELECT одновременно php – отображение ссылок на связанный контент Поиск текстовых файлов с помощью PHP с пользовательского ввода Цель не является реальной. Laravel 5 – поставщик услуг привязки к приложениям Предупреждение: mysql_num_rows (): предоставленный аргумент не является допустимым ресурсом результата MySQL как реализовать систему входа под php? PHP, Сортировка многомерного массива с помощью дочернего массива

Сравнение массивов, не распечатывающих различия

Вот мой тестовый код:

$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 ) ? Как отредактировать функцию и не менять ее при вызове функции?

Related of "Сравнение массивов, не распечатывающих различия"

Прежде всего, у вас есть недоразумение 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 ($ Ь, $ а));

Просто поменяйте массивы … первый параметр используется для отображения позиции, чтобы разность таким образом использовала значения этого массива.