2 Stimmen

PHP - Zählen übereinstimmender Arrays in Array

Ich habe eine Array-Struktur, die wie folgt aussieht:

    Array
(
    [0] => Array
        (
            [type] => image
            [data] => Array
                (
                    [id] => 1
                    [alias] => test
                    [caption] => no caption
                    [width] => 200
                    [height] => 200
                )

        )

    [1] => Array
        (
            [type] => image
            [data] => Array
                (
                    [id] => 2
                    [alias] => test2
                    [caption] => hello there
                    [width] => 150
                    [height] => 150
                )

        )

)

Meine Frage ist, wie kann ich eine Zählung der Anzahl der eingebetteten Arrays erhalten, die ihren Typ als Bild (oder etwas anderes für diese Angelegenheit) festgelegt haben? In der Praxis kann dieser Wert variieren.

Die obige Anordnung würde also eine Antwort von 2 ergeben.

Danke

2voto

Yacoby Punkte 52756

Am einfachsten wäre es, eine Schleife über alle untergeordneten Arrays zu ziehen und ihren Typ zu überprüfen, wobei ein Zähler inkrementiert wird, wenn er mit dem erforderlichen Typ übereinstimmt.

$count = 0;
foreach ( $myarray as $child ){
    if ( $child['type'] == 'image' ){
        $count++;
    }
}

Wenn Sie PHP 5.3.0 oder besser haben, können Sie array_reduce verwenden (ungetestet):

$count = array_reduce($myarray, 
                      function($c, $a){ return $c + (int)($a['type'] == 'image'); },
                      0
         );

Beides könnte in eine Funktion verschoben werden, die $count die es Ihnen ermöglichen würde, den zu zählenden Typ anzugeben. Zum Beispiel:

function countTypes(array $haystack, $type){
    $count = 0;
    foreach ( $haystack as $child ){
        if ( $child['type'] == $type ){
            $count++;
        }
    }
    return $count;
}

Wie Sie aus anderen Antworten sehen können, gibt es weit mehr Fehlerprüfung, die Sie tun könnten, jedoch Sie, wie Sie nicht gesagt haben, was unmöglich sein sollte (die Sie verwenden möchten assert für).

Die möglichen Fehler sind:

  • Das Kind ist kein Array
  • Das Kind hat das Recht type Schlüsselsatz

Wenn Ihr Array immer so angelegt sein soll wie in Ihrem Beispiel, wäre ein stillschweigendes Scheitern (durch Einfügen einer Prüfung in eine if-Anweisung) eine schlechte Idee, da es einen Fehler im Programm an anderer Stelle verdecken würde.

1voto

Crozin Punkte 42878

Sie müssen über jedes Element Ihres Arrays iterieren und prüfen, ob das Element Ihrer Bedingung entspricht:

$data = array(...);

$count = 0;
foreach ($data as $item) {
    if ('image' === $item['type']) {
        $count++;
    }
}

var_dump($count);

1voto

Franz Punkte 11123

Versuchen Sie dies:

function countArray(array $arr, $arg, $filterValue)
{
    $count = 0;
    foreach ($arr as $elem)
    {
        if (is_array($elem) &&
                isset($elem[$arg]) &&
                $elem[$arg] == $filterValue)
            $count++;
    }
    return $count;
}

In Ihrem Beispiel würden Sie es folgendermaßen nennen:

$result = countArray($array, 'type', 'image');

1voto

poke Punkte 338075
<?php
$arr    = // as above
$result = array();

for ( $i = 0; $i < count( $arr ); $i++ )
{
    if ( !isset( $result[ $arr[$i]['type'] ] ) )
        $result[ $arr[$i]['type'] ] = 0;
    $result[ $arr[$i]['type'] ]++;
}

echo $result['image']; // 2
?>

1voto

Will Vousden Punkte 31058

Zusätzlich zu Yacobys Antwort können Sie es auch funktional mit einer Closure machen, wenn Sie PHP 5.3 verwenden:

$count = 0;
array_walk($array, function($item)
{
    if ($item['type'] == 'image')
    {
        $count++;
    }
});

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