Как только эта процедура запускается, я создаю копию входной массив, чтобы манипулировать им, пока входной массив остается нетронутым. Когда я готов создать оператор 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'
);
Здесь работает 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'
);
Заменив array_diff() на array_diff_assoc(), как и ожидалось, все работает, но почему?
Подробнее здесь: https://stackoverflow.com/questions/271 ... erent-keys