Überraschenderweise array_keys_exist
gibt es nicht?! In der Zwischenzeit bleibt etwas Platz, um einen einzeiligen Ausdruck für diese allgemeine Aufgabe zu finden. Ich denke an ein Shell-Skript oder ein anderes kleines Programm.
Hinweis: Jede der folgenden Lösungen verwendet eine […]
präzise Array-Deklarationssyntax, die in PHP 5.4+ verfügbar ist
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
// all keys found
} else {
// not all
}
(Hutspitze zu Kim Stacks )
Dieser Ansatz ist der kurzeste, den ich gefunden habe. array_diff()
Gibt ein Array von Elementen zurück, die in Argument 1 vorhanden sind und in Argument2 nicht vorhanden sind. Daher zeigt ein leeres Array an, dass alle Schlüssel gefunden wurden. In PHP 5.5 könnten Sie vereinfachen 0 === count(…)
, um einfach zu sein empty(…)
.
if (0 === count(array_reduce(array_keys($source),
function($in, $key){ unset($in[array_search($key, $in)]); return $in; },
['story', 'message', '…'])))
{
// all keys found
} else {
// not all
}
Schwer zu lesen, leicht zu ändern. array_reduce()
verwendet einen Rückruf, um über ein Array zu iterieren und einen Wert zu erhalten. Wenn wir die Schlüssel eingeben, deren $initial
Wert uns interessiert, $in
und dann die in der Quelle gefundenen Schlüssel entfernen, können wir davon ausgehen, dass sie mit 0 Elementen enden, wenn alle Schlüssel gefunden wurden.
Die Konstruktion ist leicht zu ändern, da die Schlüssel, an denen wir interessiert sind, gut in das Endergebnis passen.
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
// all keys found
} else {
// not all
}
Einfacher zu schreiben als die array_reduce
Lösung, aber etwas schwieriger zu bearbeiten. array_filter
ist auch ein iterativer Rückruf, mit dem Sie ein gefiltertes Array erstellen können, indem Sie im Rückruf true (Element in neues Array kopieren) oder false (nicht kopieren) zurückgeben. Das Problem ist, dass Sie 2
die Anzahl der erwarteten Elemente ändern müssen .
Dies kann haltbarer gemacht werden, steht aber kurz vor der absurden Lesbarkeit:
$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
// all keys found
} else {
// not all
}