array_filter als SELECT-Ersatz
Alex
- php
Hallo Leute,
ich möchte gerne in PHP Daten aus einem größeren Array filtern, ähnlich wie SQL's "SELECT x FROM y WHERE z". Die Daten sind folgendermaßen organisiert:
$a = array(
array("category" => "foo", ...),
array("category" => "bar", ...),
array("category" => "foo", ...),
...
);
array_filter sieht recht vielversprechend aus, wenn ich z.B. nur nach einer einzelnen Kategorie filtern möchte:
function filterCategory ($a, $category) {
return array_filter($a, create_function('$data',
"return $data['category'] == '$category';"
));
}
Probleme krieg ich allerdings, wenn $category eine Liste sein soll, die mehrere erlaubte Kategorien enthält (als Array). Ich müßte für die Callbackfunktion entweder dieses Array in einen String zerlegen, der die Einzelbedingungen ODER-verknüpft oder das Array irgendwie anders serialisieren.
Ich kann die ganze Funktion natürlich auch ohne array_filter realisieren, indem ich einfach von Hand alle Arrayelemente aussortiere. Kein Problem! Mich würde aber generell interessieren, wie/ob man array_filter für solch komplizierte Fälle benutzen kann.
Viele Grüße,
Alex
Hellihello Alex,
in_array() hilft da nicht weiter, oder?
Probleme krieg ich allerdings, wenn $category eine Liste sein soll, die mehrere erlaubte Kategorien enthält (als Array).
Dank und Gruß,
frankx
Hallo frankx,
in_array() hilft da nicht weiter, oder?
Nicht direkt, aber darauf lief meine Frage hinaus. Ich möchte nämlich in_array für die Überprüfung benutzen, kriege aber nicht das Referenzarray $category in die Callbackfunktion. Mit einem einfachen String kein Problem, weil ich den in der anonymen Funktion benutzen kann. Aber das Array ist eben kein String. :-(
Als Möglichkeit hab ich bisher das "Globalisieren" des Referenzarrays gefunden:
function filterCategoryCallback ($data) {
global $category;
return in_array($data["category"], $category);
}
function filterCategory ($a) {
return array_filter($a, "filterCategoryCallback");
}
Solche globalen Variablen möchte ich allerdings nach Möglichkeit vermeiden, zumal die Funktion letztendlich auch noch etwas umfangreicher werden soll.
Viele Grüße,
Alex
Hellihello Alex,
so ganz kapier ichs vielleicht nicht, array_walk probiertest du auch?
Gruß,
frankx
Hallo frankx,
so ganz kapier ichs vielleicht nicht, array_walk probiertest du auch?
Nein, da ich die Arrayelemente ja nicht bearbeiten wollte sondern wirklich bloß filtern. Oder hattest Du was bestimmtes mit array_walk vor, um das zu erreichen?
Grüße,
Alex
Hellihello
Nein, da ich die Arrayelemente ja nicht bearbeiten wollte sondern wirklich bloß filtern. Oder hattest Du was bestimmtes mit array_walk vor, um das zu erreichen?
Na filtern könnte ja auch heißen, das ganze Ding kopieren und die nicht-Treffer rauslöschen aus der Kopie.
Gruß,
frankx
echo $begrüßung;
Ich möchte nämlich in_array für die Überprüfung benutzen, kriege aber nicht das Referenzarray $category in die Callbackfunktion. Mit einem einfachen String kein Problem, weil ich den in der anonymen Funktion benutzen kann. Aber das Array ist eben kein String.
explode() wandelt einen String in ein Array, wenn du zwischen den Werten Trennzeichen platziert hast.
echo "$verabschiedung $name";
Hallo dedlfix,
Ich möchte nämlich in_array für die Überprüfung benutzen, kriege aber nicht das Referenzarray $category in die Callbackfunktion. Mit einem einfachen String kein Problem, weil ich den in der anonymen Funktion benutzen kann. Aber das Array ist eben kein String.
explode() wandelt einen String in ein Array, wenn du zwischen den Werten Trennzeichen platziert hast.
Das ist 'ne Idee. Würde aber bedeuten, das Array erst in einen String zu überführen und in der Callbackfunktion wieder zurück in ein Array. Etwas umständlich, finde ich. Geht's nicht einfacher, auf einem _direkteren_ Weg?