Удивительно array_keys_exist
не существует ?! Тем временем это оставляет место для определения однострочного выражения для этой общей задачи. Я думаю о сценарии оболочки или другой небольшой программе.
Примечание: каждое из следующих решений использует краткий […]
синтаксис объявления массива, доступный в php 5.4+
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
} else {
}
(подсказка Ким Стакс )
Это самый краткий подход, который я нашел. array_diff()
возвращает массив элементов, присутствующих в аргументе 1, отсутствующих в аргументе 2. Следовательно, пустой массив указывает, что все ключи были найдены. В php 5.5 вы можете упростить, 0 === count(…)
чтобы быть просто empty(…)
.
if (0 === count(array_reduce(array_keys($source),
function($in, $key){ unset($in[array_search($key, $in)]); return $in; },
['story', 'message', '…'])))
{
} else {
}
Сложнее читать, легко изменить. array_reduce()
использует обратный вызов для перебора массива для получения значения. Подавая ключи мы заинтересованы в $initial
стоимости , $in
а затем удаление ключей найдены в источнике можно ожидать до конца с 0 элементами , если были найдены все ключи.
Конструкцию легко изменить, так как интересующие нас клавиши хорошо вписываются в нижнюю строку.
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
} else {
}
Проще написать, чем array_reduce
решение, но немного сложнее отредактировать. array_filter
также является итеративным обратным вызовом, который позволяет создавать фильтрованный массив, возвращая в обратном вызове значение true (копировать элемент в новый массив) или false (не копировать). Проблема в том, что вы должны изменить 2
количество предметов, которое вы ожидаете.
Это можно сделать более надежным, но граничащее с абсурдной читабельностью:
$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
} else {
}