Почему array_diff() удаляет элементы с одинаковым значением, но разными ключами?Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему array_diff() удаляет элементы с одинаковым значением, но разными ключами?

Сообщение Anonymous »

В моем коде есть процедура, которая вычисляет разницу между двумя массивами для создания оператора SQL UPDATE.

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

В каждом тесте, который я запускал, оба массива были заполнены пары ключ=значение, и все значения были строками, даже если они были целыми числами в базе данных (поведение PDO), и до сих пор все работало безупречно.

Но сейчас я Я нашел что-то странное. Два разных действия в двух разных контроллерах, но с одной и той же логикой, приводят к разным различиям:

Это работает так, как ожидалось:

Код: Выделить всё

$input = array(
'tid' => '3',
'enabled' => '1'
);

$modified = array(
'tid' => '3',
'enabled' => 0,
'modified' => '2014-11-26 15:17:55'
};

$diff = array(
'enabled' => 0,
'modified' => '2014-11-26 15:17:55'
);
$input — это результат запроса. $modified — это копия первого массива, которым манипулируют методы класса. Когда я готов создать оператор, вычисляется $diff, чтобы отправить PDO (или другому драйверу) правильный оператор.

Здесь работает array_diff(). индекс tid присутствует в обоих массивах и игнорируется. включено, простой флаг включения/выключения, отличается от других и включен в него. Представление даты и времени тоже.

Но посмотрите на переменные в другом случае:

Код: Выделить всё

$input2 = array(
'sid' => '1',
'finished' => '0'
);

$modified2 = array(
'sid' => '1',
'finished' => 1,
'modified' => '2014-11-26 15:21:58'
);

$diff2 = array(
'modified' => '2014-11-26 15:21:58'
);
То же, что и раньше, но с другими именами полей. sid игнорируется, но finished тоже игнорируется, хотя этого не должно быть, поскольку он отсутствует в $input.

Заменив array_diff() на array_diff_assoc(), как и ожидалось, все работает, но почему?

Подробнее здесь: https://stackoverflow.com/questions/271 ... erent-keys
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»