Sorprendentemente array_keys_exist
non esiste ?! Nel frattempo che lascia un po 'di spazio per capire una singola espressione di riga per questo compito comune. Sto pensando a uno script di shell o ad un altro piccolo programma.
Nota: ciascuna delle seguenti soluzioni utilizza la […]
sintassi concisa della dichiarazione di array disponibile in php 5.4+
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
} else {
}
(punta di cappello a Kim Stacks )
Questo approccio è il più breve che ho trovato. array_diff()
restituisce un array di elementi presenti nell'argomento 1 non presenti nell'argomento 2. Pertanto un array vuoto indica che tutte le chiavi sono state trovate. In php 5.5 potresti semplificare 0 === count(…)
per essere semplicemente empty(…)
.
if (0 === count(array_reduce(array_keys($source),
function($in, $key){ unset($in[array_search($key, $in)]); return $in; },
['story', 'message', '…'])))
{
} else {
}
Più difficile da leggere, facile da cambiare. array_reduce()
utilizza un callback per iterare su un array per arrivare a un valore. Fornendo le chiavi di cui siamo interessati al $initial
valore $in
e quindi rimuovendo le chiavi trovate nel sorgente, possiamo aspettarci di finire con 0 elementi se tutte le chiavi sono state trovate.
La costruzione è facile da modificare poiché i tasti a cui siamo interessati si adattano bene alla linea di fondo.
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
} else {
}
Più semplice da scrivere rispetto alla array_reduce
soluzione ma leggermente più complicato da modificare.array_filter
è anche un callback iterativo che consente di creare un array filtrato restituendo true (copia l'elemento in un nuovo array) o false (non copiare) nel callback. Il gotchya è che devi cambiare 2
il numero di articoli che ti aspetti.
Questo può essere reso più durevole ma rasenta una leggibilità assurda:
$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
} else {
}