wake-up-neo.com

in_array () und mehrdimensionales Array

Ich verwende in_array(), um zu überprüfen, ob ein Wert in einem Array wie unten vorhanden ist.

$a = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $a)) 
{
    echo "Got Irix";
}

//print_r($a);

aber was ist mit einem mehrdimensionalen Array (unten) - wie kann ich diesen Wert überprüfen, ob er im Multi-Array vorhanden ist?

$b = array(array("Mac", "NT"), array("Irix", "Linux"));

print_r($b);

oder sollte ich in_array() nicht verwenden, wenn es um das mehrdimensionale Array geht?

222
laukok

in_array() funktioniert nicht bei mehrdimensionalen Arrays. Sie könnten eine rekursive Funktion schreiben, um das für Sie zu tun:

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

Verwendungszweck:

$b = array(array("Mac", "NT"), array("Irix", "Linux"));
echo in_array_r("Irix", $b) ? 'found' : 'not found';
438
jwueller

Das wird auch funktionieren.

function in_array_r($item , $array){
    return preg_match('/"'.preg_quote($item, '/').'"/i' , json_encode($array));
}

Verwendungszweck:

if(in_array_r($item , $array)){
    // found!
}
52
NassimPHP

Wenn Sie wissen, in welcher Spalte gesucht werden soll, können Sie array_search () und array_column () verwenden:

$userdb = Array
(
    (0) => Array
        (
            ('uid') => '100',
            ('name') => 'Sandra Shush',
            ('url') => 'urlof100'
        ),

    (1) => Array
        (
            ('uid') => '5465',
            ('name') => 'Stefanie Mcmohn',
            ('url') => 'urlof5465'
        ),

    (2) => Array
        (
            ('uid') => '40489',
            ('name') => 'Michael',
            ('url') => 'urlof40489'
        )
);

if(array_search('urlof5465', array_column($userdb, 'url')) !== false) {
    echo 'value is in multidim array';
}
else {
    echo 'value is not in multidim array';
}

Diese Idee befindet sich in den Kommentaren für array_search () im Handbuch PHP.

39
ethmz

Das wird es tun:

foreach($b as $value)
{
    if(in_array("Irix", $value, true))
    {
        echo "Got Irix";
    }
}

Da in_array nur für ein eindimensionales Array funktioniert, müssen Sie jedes Subarray durchlaufen und auf jedem in_array ausführen.

Wie bereits erwähnt, gilt dies nur für ein zweidimensionales Array. Wenn Sie mehr verschachtelte Arrays haben, wäre eine rekursive Version besser. Siehe die anderen Antworten für Beispiele.

33
Alan Geleynse

wenn dein Array so ist

$array = array(
              array("name" => "Robert", "Age" => "22", "Place" => "TN"), 
              array("name" => "Henry", "Age" => "21", "Place" => "TVL")
         );

Benutze das

function in_multiarray($elem, $array,$field)
{
    $top = sizeof($array) - 1;
    $bottom = 0;
    while($bottom <= $top)
    {
        if($array[$bottom][$field] == $elem)
            return true;
        else 
            if(is_array($array[$bottom][$field]))
                if(in_multiarray($elem, ($array[$bottom][$field])))
                    return true;

        $bottom++;
    }        
    return false;
}

beispiel: echo in_multiarray("22", $array,"Age");

22
rynhe
$userdb = Array
(
    (0) => Array
        (
            ('uid') => '100',
            ('name') => 'Sandra Shush',
            ('url') => 'urlof100'
        ),

    (1) => Array
        (
            ('uid') => '5465',
            ('name') => 'Stefanie Mcmohn',
            ('url') => 'urlof5465'
        ),

    (2) => Array
        (
            ('uid') => '40489',
            ('name') => 'Michael',
            ('url') => 'urlof40489'
        )
);

$url_in_array = in_array('urlof5465', array_column($userdb, 'url'));

if($url_in_array) {
    echo 'value is in multidim array';
}
else {
    echo 'value is not in multidim array';
}
13
Mukesh Goyal

Tolle Funktion, aber es funktionierte nicht für mich, bis ich if($found) { break; } zur elseif

function in_array_r($needle, $haystack) {
    $found = false;
    foreach ($haystack as $item) {
    if ($item === $needle) { 
            $found = true; 
            break; 
        } elseif (is_array($item)) {
            $found = in_array_r($needle, $item); 
            if($found) { 
                break; 
            } 
        }    
    }
    return $found;
}
13
Fernando

Sie können Ihr mehrdimensionales Array immer serialisieren und eine strpos ausführen:

$arr = array(array("Mac", "NT"), array("Irix", "Linux"));

$in_arr = (bool)strpos(serialize($arr),'s:4:"Irix";');

if($in_arr){
    echo "Got Irix!";
}

Verschiedene Dokumente für Dinge, die ich verwendet habe:

6
user1846065

Für mehrdimensionale Kinder: in_array('needle', array_column($arr, 'key'))

Für eindimensionale Kinder: in_array('needle', call_user_func_array('array_merge', $arr))

4

Seit PHP 5.6 gibt es eine bessere und sauberere Lösung für die ursprüngliche Antwort :

Mit einem mehrdimensionalen Array wie folgt:

$a = array(array("Mac", "NT"), array("Irix", "Linux"))

Wir können den Splat-Operator verwenden:

return in_array("Irix", array_merge(...$a), true)

Wenn Sie String-Schlüssel wie folgt haben:

$a = array("a" => array("Mac", "NT"), "b" => array("Irix", "Linux"))

Sie müssen array_values verwenden, um den Fehler Cannot unpack array with string keys zu vermeiden:

return in_array("Irix", array_merge(...array_values($a)), true)
2
Fabien Salles

Ich glaube, dass Sie array_key_exists heutzutage verwenden können:

<?php
$a=array("Mac"=>"NT","Irix"=>"Linux");
if (array_key_exists("Mac",$a))
  {
  echo "Key exists!";
  }
else
  {
  echo "Key does not exist!";
  }
?>
1
SrAxi

Die akzeptierte Lösung (zum Zeitpunkt des Schreibens) von jwueller

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

Ist vollkommen korrekt, kann jedoch bei einem schwachen Vergleich ungewolltes Verhalten zeigen (Parameter $strict = false).

Wegen des Jonglierens des PHP-Typs beim Vergleichen von Werten verschiedener Typen

"example" == 0

und

0 == "example"

Wertet true aus, da "example" in int umgewandelt und in 0 umgewandelt wird.

(Siehe Warum betrachtet PHP 0 als Zeichenfolge?)

Wenn dies nicht das gewünschte Verhalten ist, kann es zweckmäßig sein, numerische Werte in einen String umzuwandeln, bevor ein nicht strenger Vergleich durchgeführt wird:

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {

        if( ! $strict && is_string( $needle ) && ( is_float( $item ) || is_int( $item ) ) ) {
            $item = (string)$item;
        }

        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}
1
Paolo

Hier ist mein Vorschlag basierend auf json_encode () solution mit:

  • GroßKleinschreibung -/Option
  • Rückgabe der Zählung statt true
  • irgendwo in Arrays (Schlüssel und Werte)

Wenn Word nicht gefunden wird, wird 0 gleich false zurückgegeben.

function in_array_count($needle, $haystack, $caseSensitive = true) {
    if(!$caseSensitive) {
        return substr_count(strtoupper(json_encode($haystack)), strtoupper($needle));
    }
    return substr_count(json_encode($haystack), $needle);
}

Ich hoffe es hilft.

1
Meloman

Kürzere Version für mehrdimensionale Arrays, die basierend auf Datenbankergebnissätzen erstellt wurden.

function in_array_r($array, $field, $find){
    foreach($array as $item){
        if($item[$field] == $find) return true;
    }
    return false;
}

$is_found = in_array_r($os_list, 'os_version', 'XP');

Wird zurückgegeben, wenn das $ os_list-Array im Feld os_version 'XP' enthält.

0
andreszs

Ich suchte nach einer Funktion, mit der ich sowohl nach Strings als auch nach Arrays (als Nadel) im Array (Heuhaufen) suchen würde, also habe ich die answer von @jwueller hinzugefügt.

Hier ist mein Code:

/**
 * Recursive in_array function
 * Searches recursively for needle in an array (haystack).
 * Works with both strings and arrays as needle.
 * Both needle's and haystack's keys are ignored, only values are compared.
 * Note: if needle is an array, all values in needle have to be found for it to
 * return true. If one value is not found, false is returned.
 * @param  mixed   $needle   The array or string to be found
 * @param  array   $haystack The array to be searched in
 * @param  boolean $strict   Use strict value & type validation (===) or just value
 * @return boolean           True if in array, false if not.
 */
function in_array_r($needle, $haystack, $strict = false) {
     // array wrapper
    if (is_array($needle)) {
        foreach ($needle as $value) {
            if (in_array_r($value, $haystack, $strict) == false) {
                // an array value was not found, stop search, return false
                return false;
            }
        }
        // if the code reaches this point, all values in array have been found
        return true;
    }

    // string handling
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle)
            || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }
    return false;
}
0
FreshSnow

Ich habe diese Methode verwendet, funktioniert für eine beliebige Anzahl von verschachtelten und erfordert kein Hacken

<?php
    $blogCategories = [
        'programing' => [
            'golang',
            'php',
            'Ruby',
            'functional' => [
                'Erlang',
                'Haskell'
            ]
        ],
        'bd' => [
            'mysql',
            'sqlite'
        ]
    ];
    $it = new RecursiveArrayIterator($blogCategories);
    foreach (new RecursiveIteratorIterator($it) as $t) {
        $found = $t == 'Haskell';
        if ($found) {
           break;
        }
    }
0
Sr. Libre

Es funktioniert auch, um zuerst ein neues eindimensionales Array aus dem ursprünglichen zu erstellen.

$arr = array("key1"=>"value1","key2"=>"value2","key3"=>"value3");

foreach ($arr as $row)  $vector[] = $row['key1'];

in_array($needle,$vector);
0
Banzy

Dies ist die erste Funktion dieses Typs, die ich im php-Handbuch für in_array gefunden habe. Funktionen in den Kommentarteilen sind nicht immer die besten, aber wenn es nicht den Trick schafft, können Sie auch dort reinschauen :)

<?php
function in_multiarray($elem, $array)
    {
        // if the $array is an array or is an object
         if( is_array( $array ) || is_object( $array ) )
         {
             // if $elem is in $array object
             if( is_object( $array ) )
             {
                 $temp_array = get_object_vars( $array );
                 if( in_array( $elem, $temp_array ) )
                     return TRUE;
             }

             // if $elem is in $array return true
             if( is_array( $array ) && in_array( $elem, $array ) )
                 return TRUE;


             // if $elem isn't in $array, then check foreach element
             foreach( $array as $array_element )
             {
                 // if $array_element is an array or is an object call the in_multiarray function to this element
                 // if in_multiarray returns TRUE, than return is in array, else check next element
                 if( ( is_array( $array_element ) || is_object( $array_element ) ) && $this->in_multiarray( $elem, $array_element ) )
                 {
                     return TRUE;
                     exit;
                 }
             }
         }

         // if isn't in array return FALSE
         return FALSE;
    }
?>
0
Gazillion

Ich habe eine wirklich kleine einfache Lösung gefunden:

Wenn Ihr Array ist:

Array
(
[details] => Array
    (
        [name] => Dhruv
        [salary] => 5000
    )

[score] => Array
    (
        [ssc] => 70
        [diploma] => 90
        [degree] => 70
    )

)

dann lautet der Code wie folgt:

 if(in_array("5000",$array['details'])){
             echo "yes found.";
         }
     else {
             echo "no not found";
          }
0
Dhruv Thakkar