4 Stimmen

Array in Unterarrays aufteilen

Ich möchte ein Array aufteilen:

$o = json_decode('[{"id":"1","color":"green"},{"id":"2","color":"green"},{"id":"3","color":"yellow"},{"id":"4","color":"green"}]');

basierend auf dem Farbattribut jedes Elements und die entsprechenden Unterarrays füllen

$a = array("grün", "gelb", "blau");

function isGreen($var){
    return($var->color == "grün");
}

$greens = array_filter($o, "isGreen");
$yellows = array_filter($o, "isYellow");
// und alle möglichen Kategorien in $a..

Mein $a hat eine Länge > 20 und könnte sich weiter erhöhen, daher benötige ich eine generelle Methode anstelle von Funktionen, die von Hand geschrieben werden

Es scheint keine Funktion array_split zu geben, um alle gefilterten Arrays zu erzeugen
sonst benötige ich vielleicht eine Art Lambda-Funktion

0 Stimmen

Also, du möchtest eine Funktion für jeden Wert in $a? Oder verstehe ich es falsch?

0 Stimmen

Entschuldigung, was ist falsch an einer Schleife? Das Generieren anonymer Funktionen scheint hier wie eine übermäßige Komplikation...

2 Stimmen

Wäre es nicht schlauer, die Funktion isColour() zu verwenden?

6voto

PeeHaa Punkte 68988

Sie könnten so etwas tun:

$o = json_decode('[{"id":"1","color":"green"},{"id":"2","color":"green"},{"id":"3","color":"yellow"},{"id":"4","color":"green"}');

$greens = array_filter($o, function($item) {
    if ($item->color == 'green') {
        return true;
    }

    return false;
});

Oder wenn Sie etwas wirklich Allgemeines erstellen möchten, könnten Sie etwas Ähnliches wie das Folgende tun:

function filterArray($array, $type, $value)
{
    $result = array();
    foreach($array as $item) {
        if ($item->{$type} == $value) {
            $result[] = $item;
        }
    }

    return $result;
}

$o = json_decode('[{"id":"1","color":"green"},{"id":"2","color":"green"},{"id":"3","color":"yellow"},{"id":"4","color":"green"}]');
$greens = filterArray($o, 'color', 'green');
$yellows = filterArray($o, 'color', 'yellow');

In meinem zweiten Beispiel könnten Sie einfach das Array übergeben und der Funktion mitteilen, nach welchem Wert gefiltert werden soll (z. B. Farbe oder einer anderen zukünftigen Eigenschaft).

Beachten Sie, dass keine Fehlerüberprüfung durchgeführt wurde, ob die Eigenschaften tatsächlich existieren

1voto

simshaun Punkte 20979

Ich würde nicht den Weg gehen, eine Menge von Funktionen, manuell oder dynamisch, zu erstellen.

Hier ist meine Idee, und das Design könnte so geändert werden, dass Filter verketten können:

items = $items;
    }

    public function byColor($color)
    {
        $items = array();

        foreach ($this->items as $item) {
            // Ich mag das nicht: Ich würde es vorziehen, dass jedes Element ein Objekt war und getColor() hatte
            if (empty($item->color) || $item->color != $color)
                continue;

            $items[] = $item;
        }

        return $items;
    }
}

$items = json_decode('[{"id":"1","color":"green"},{"id":"2","color":"green"},{"id":"3","color":"yellow"},{"id":"4","color":"green"}]');
$filter = new ItemsFilter($items);
$greens = $filter->byColor('green');

echo '';
print_r($greens);
echo '';

0voto

hovado Punkte 3763

Wenn Sie mehr Argumente benötigen, könnten Sie diese Funktion verwenden:

function splitArray($array, $params) {
    $result = array();

    foreach ($array as $item) {

        $status = true;

        foreach ($params as $key => $value) {
            if ($item[$key] != $value) {
                $status = false;
                continue;
            }
        }

        if ($status == true) {
            $result[] = $item;
        }
    }

    return $result;
}

$greensAndID1 = splitArray($o, array('color' => 'green', 'id' => 1));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X