Я считаю, array_intersect - это то, что вам нужно.
array_intersect () возвращает массив, содержащий все значения array1, присутствующие во всех аргументах. Обратите внимание, что ключи сохранены.
blockquote>Обратите внимание, что сравнение чувствительно к регистру.
Таким образом, вы можете преобразовать массив в нижний регистр, а затем выполнить array_intersect для них,
$haystack = [ 11 => 'Parenting', 48 => 'How', 50 => 'Parenting', 54 => 'parenting', 57 => 'parenting', 58 => 'style', 59 => 'that', 60 => 'offers', 61 => 'kids', 62 => 'greater', 63 => 'freedom', ]; $needle = ['Parenting', 'offer', 'freedom']; $result = array_intersect(array_map('strtolower', $haystack), array_map('strtolower', $needle));
Проблема является на самом деле несколько сложной. Операнды арифметических выражений преобразовываются с помощью определенных правил, что Вы видите в Разделе 3.2.1.5 из Стандарта (C89). В Вашем случае ответ зависит от какой тип uint16_t
. Если это меньше, чем int
, сказать short int
, затем операнды преобразовываются в int
и Вы добираетесь-4000, но в 16-разрядной системе, uint16_t
мог быть unsigned int
и преобразования в тип со знаком не произошло бы автоматически.
Оба операнда продвинуты на int32_t
во время вычитания. Если результат был больше, чем максимальное значение для int32_t
Вы видели бы переполнение.
Существует, на самом деле, переполнение, но C не говорит Вам.
Переполнение оставляет значение, которое, оказывается,-4000 при интерпретации как целое число со знаком. Это работает, как разработано над 2's дополнительные машины.
Попытайтесь интерпретировать результат как неподписанный, и Вы заметите, что (u1-u2) оценивает к некоторому на вид несвязанному числу когда u1 <u2.
Короткий ответ - то, что они все продвинуты на int
во время вычитания. Для длинного ответа посмотрите на раздел 6.3.1.1 из стандарта C, где он говорит о целочисленных продвижениях в арифметических выражениях. Соответствующий язык из стандарта:
Если
int
может представить все значения исходного типа, значение преобразовывается вint
; иначе это преобразовывается вunsigned int
. Их называют целочисленными продвижениями. Все другие типы неизменны целочисленными продвижениями.
Детали там также, но они становятся довольно противными.