Ich bin immer noch nicht davon überzeugt, dass du dir mit dem großen Datenhaufen einen Gefallen tust. Es wird auch nicht besser, wenn du den großen Datenhaufen erst auf Überflüssiges hin auswertest, um dann die den kleineren Datenhaufen nach anderen Kriterien auszuwerten.
Doch nun zu deiner Funktion. (Ich erlaube mir mal, die etwas lesefreundlicher zu zitieren)
function redu_array($ar, $option = 1) {
// option 1 = Keys reduzieren
// option 2 = Erste Ebene entfernen
foreach ($ar as $k => $w) {
if (is_array($w)) {
redu_array($ar[$k]);
hier musst du das zurückgegebene reduzierte Array auch wieder dem $ar[$k] zuweisen, sonst war das ja alles für den Stubentiger
$ar[$k] = redu_array($w);
}// weitere ebenen suchen
elseif (!$w) {
empty($w) statt !$w gäbe hier deutlicher zu verstehen, worauf du hinauswillst
außerdem wolltest du auch das zurückgebene Array auf "leer" prüfen oder nicht? Also if statt elseif und $ar[$k] statt $w prüfen
if (empty($ar[$k])) {
unset($ar[$k]);
unset($w);
unset($w) ist überflüssig, da es bei jedem Schleifenwert sowieso neu gefüllt wird. (Du weißt, dass das nur eine Kopie des Wertes aus dem Array ist und keine Referenz darauf?)
}
Das ganze if nochmal neu geschrieben sähe dann so aus:
if (is_array($w))
$ar[$k] = redu_array($w);
if (empty($ar[$k]))
unset($ar[$k]);
} //foreach (hattest du vergessen zu schließen)
return $ar;
Und dann war da noch der Fall 'beta':
return (count($ar) == 1) ? reset($ar) : $ar;
} // end of func.
Für Option 2 würde ich eine eigene Funktion schreiben, da sich diese Funktionalität m.E. nicht so einfach oben integrieren lässt, ohne zu dem Daten-Kuddelmuddel nicht auch noch ein Code-Kuddelmuddel hinzuzufügen.
Du kannst ja damit schon mal anfangen, ich tue jetzt erstmal was anderes...