PHP Multidimensional Array Searching (Schlüssel anhand eines bestimmten Werts finden)

Lesezeit: 8 Minuten

Ich habe dieses mehrdimensionale Array. Ich muss es durchsuchen und nur den Schlüssel zurückgeben, der mit dem Wert des “Slug” übereinstimmt. Ich weiß, dass es andere Threads zum Durchsuchen mehrdimensionaler Arrays gibt, aber ich verstehe nicht genug, um es auf meine Situation anzuwenden. Vielen Dank für jede Hilfe!

Also brauche ich eine Funktion wie:

myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1

Hier ist das Array:

$products = array (
1  => array(
        'name'          => 'The Breville One-Touch Tea Maker',
        'slug'          => 'breville-one-touch-tea-maker-BTM800XL',
        'shortname'     => 'The One-Touch Tea Maker',
        'listprice'     => '299.99',
        'price'         => '249.99',
        'rating'        => '9.5',
        'reviews'       => '81',
        'buyurl'        => 'http://www.amazon.com/The-Breville-One-Touch-Tea-Maker/dp/B003LNOPSG',
        'videoref1'     => 'xNb-FOTJY1c',
        'videoref2'     => 'WAyk-O2B6F8',
        'image'         => '812BpgHhjBML.jpg',
        'related1'      => '2',
        'related2'      => '3',
        'related3'      => '4',
        'bestbuy'       => '1',
        'quote'         => '',
        'quoteautor'    => 'K. Martino',
        ),

2  => array(
        'name'          => 'Breville Variable-Temperature Kettle BKE820XL',
        'slug'          => 'breville-variable-temperature-kettle-BKE820XL',
        'shortname'     => 'Variable Temperature Kettle',
        'listprice'     => '199.99',
        'price'         => '129.99',
        'rating'        => '9',
        'reviews'       => '78',
        'buyurl'        => 'http://www.amazon.com/Breville-BKE820XL-Variable-Temperature-1-8-Liter-Kettle/dp/B001DYERBK',
        'videoref1'     => 'oyZWBD83xeE',
        'image'         => '41y2B8jSKmwL.jpg',
        'related1'      => '3',
        'related2'      => '4',
        'related3'      => '5',
        'bestbuy'       => '1',
        'quote'         => '',
        'quoteautor'    => '',
        ),
);

  • Sie können dies mit der Klasse tun, die ich hier gepostet habe: stackoverflow.com/a/69304668/4276501

    – Serj

    23. September 2021 um 17:57 Uhr

PHP Multidimensional Array Searching Schlussel anhand eines bestimmten Werts finden
Ivan Rodríguez Torres

Eine andere mögliche Lösung basiert auf der array_search() Funktion. Sie müssen PHP 5.5.0 verwenden oder höher.

Beispiel

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

(1) => Array
    (
        (uid) => '5465',
        (name) => 'Stefanie Mcmohn',
        (pic_square) => 'urlof100'
    ),

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

$key = array_search(40489, array_column($userdb, 'uid'));

echo ("The key is: ".$key);
//This will output- The key is: 2

Erläuterung

Die Funktion array_search() hat zwei Argumente. Der erste ist der Wert, nach dem Sie suchen möchten. Der zweite ist, wo die Funktion suchen soll. Die Funktion array_column() erhält die Werte der Elemente, deren Schlüssel ist 'uid'.

Zusammenfassung

Sie könnten es also verwenden als:

array_search('breville-one-touch-tea-maker-BTM800XL', array_column($products, 'slug'));

oder, wenn Sie es vorziehen:

// define function
function array_search_multidim($array, $column, $key){
    return (array_search($key, array_column($array, $column)));
}

// use it
array_search_multidim($products, 'slug', 'breville-one-touch-tea-maker-BTM800XL');

Das Originalbeispiel (von xfoxawy) finden Sie auf der DOKUMENTE.
Die array_column() Seite.


Aktualisieren

Aufgrund des Kommentars von Vael war ich neugierig, also machte ich einen einfachen Test, um die Leistung der verwendeten Methode zu messen array_search und die auf der akzeptierten Antwort vorgeschlagene Methode.

Ich habe ein Array erstellt, das 1000 Arrays enthielt, die Struktur war wie folgt (alle Daten wurden randomisiert):

[
      {
            "_id": "57fe684fb22a07039b3f196c",
            "index": 0,
            "guid": "98dd3515-3f1e-4b89-8bb9-103b0d67e613",
            "isActive": true,
            "balance": "$2,372.04",
            "picture": "http://placehold.it/32x32",
            "age": 21,
            "eyeColor": "blue",
            "name": "Green",
            "company": "MIXERS"
      },...
]

Ich habe den Suchtest 100 Mal durchgeführt, um nach verschiedenen Werten für das Namensfeld zu suchen, und dann habe ich die mittlere Zeit berechnet Millisekunden. Hier Sie können ein Beispiel sehen.

Die Ergebnisse waren, dass die für diese Antwort vorgeschlagene Methode etwa 2E-7 benötigte, um den Wert zu finden, während die akzeptierte Antwortmethode etwa 8E-7 benötigte.

Wie ich bereits sagte, sind beide Zeiten ziemlich akzeptabel für eine Anwendung, die ein Array mit dieser Größe verwendet. Wenn die Größe stark zunimmt, sagen wir 1M Elemente, dann wird auch dieser kleine Unterschied größer.

Aktualisierung II

Ich habe einen Test für die Methode basierend auf hinzugefügt array_walk_recursive was in einigen der Antworten hier erwähnt wurde. Das erhaltene Ergebnis ist das richtige. Und wenn wir uns auf die Leistung konzentrieren, ist es etwas schlechter als die anderen untersuchten Prüfung. Im Test sieht man, dass es etwa 10 Mal langsamer ist als die zugrunde liegende Methode array_search. Auch dies ist für die meisten Anwendungen kein sehr relevanter Unterschied.

Aktualisierung III

Vielen Dank an @mickmackusa für das Erkennen mehrerer Einschränkungen dieser Methode:

  • Diese Methode schlägt bei assoziativen Schlüsseln fehl.
  • Diese Methode funktioniert nur bei indizierten Subarrays (beginnend bei 0 und mit fortlaufend aufsteigenden Schlüsseln).

  • Kennt jemand die Leistung davon? Es scheint, als wäre es letztendlich langsamer und würde immer noch 5.5 erfordern. Ich kann nicht testen, da ich auf 5.4 bin.

    – Vael Victus

    22. September 2016 um 21:42 Uhr

  • Für alle, die es nicht verstehen: In PHP 7 sind die for-Schleifen schneller. Als ich in diesem eval.in-Beispiel zu 5.6 wechselte, war array_search etwas schneller.

    – Vael Victus

    13. November 2016 um 15:12 Uhr

  • klug! Ich habe etwas Ähnliches gemacht, indem ich array_combine() mit array_column() verwendet habe, um ein weiteres Array zu erstellen, aus dem ich mein Datum mit einem bekannten Schlüssel holen kann, aber das ist eleganter.

    – David

    19. Oktober 2017 um 19:31 Uhr


  • Verwenden array_search() mit array_column() funktioniert nicht mit dem Sample-Array des OP, da die Subarray-Tasten von beginnen 1. Diese Methode schlägt auch bei assoziativen Schlüsseln fehl. Diese Methode funktioniert nur bei indizierten Subarrays (ab 0 und haben fortlaufend aufsteigende Tasten). Der Grund dafür ist, weil array_column() generiert neue Indizes in seinem zurückgegebenen Array.

    – mickmackusa

    29. Januar 2018 um 12:56 Uhr

  • völlig richtig @mickmackusa, ich habe dein Wissen zur Antwort hinzugefügt. Danke für die Hilfe

    – Iván Rodríguez Torres

    29. Januar 2018 um 14:40 Uhr

PHP Multidimensional Array Searching Schlussel anhand eines bestimmten Werts finden
Aurelio deRosa

Sehr einfach:

function myfunction($products, $field, $value)
{
   foreach($products as $key => $product)
   {
      if ( $product[$field] === $value )
         return $key;
   }
   return false;
}

  • Wenn Sie diese Funktion in einer bedingten Anweisung verwenden, sollten Sie eine absolute Überprüfung des Typs durchführen, da der zurückgegebene Schlüssel manchmal einen Index von haben kann [0]. Wenn Sie also eine Bedingungsprüfung durchführen, sollte sie ungefähr so ​​​​aussehen: if (myfunction($array, 'field', 'value') !== FALSE )) // do something...

    – Andy Koch

    17. November 2015 um 21:11 Uhr


  • Einfache Lösung für beste Leistung und Verständnis der Techniker.

    – LUISAO

    7. August 2021 um 15:46 Uhr

  • Danke dafür. Es ist einfach und zuverlässig. Ich habe dies und die Alternative , array_search($value, array_column($searchArray, $searchKey)) getestet. Ich erhalte falsche Ergebnisse vom array_search()/array_column-Ansatz.

    – CheddarMonkey

    17. September 2021 um 19:56 Uhr


Diese Klassenmethode kann im Array nach mehreren Bedingungen suchen:

class Stdlib_Array
{
    public static function multiSearch(array $array, array $pairs)
    {
        $found = array();
        foreach ($array as $aKey => $aVal) {
            $coincidences = 0;
            foreach ($pairs as $pKey => $pVal) {
                if (array_key_exists($pKey, $aVal) && $aVal[$pKey] == $pVal) {
                    $coincidences++;
                }
            }
            if ($coincidences == count($pairs)) {
                $found[$aKey] = $aVal;
            }
        }

        return $found;
    }    
}

// Example:

$data = array(
    array('foo' => 'test4', 'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test1', 'bar' => 'baz3'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz4'),
    array('foo' => 'test4', 'bar' => 'baz1'),
    array('foo' => 'test',  'bar' => 'baz1'),
    array('foo' => 'test3', 'bar' => 'baz2'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test4', 'bar' => 'baz1')
);

$result = Stdlib_Array::multiSearch($data, array('foo' => 'test4', 'bar' => 'baz1'));

var_dump($result);

Wird herstellen:

array(2) {
  [5]=>
  array(2) {
    ["foo"]=>
    string(5) "test4"
    ["bar"]=>
    string(4) "baz1"
  }
  [10]=>
  array(2) {
    ["foo"]=>
    string(5) "test4"
    ["bar"]=>
    string(4) "baz1"
  }
}

  • Hallo Fatalist, stackoverflow.com/questions/40860030/… . Es bezieht sich auf diese Frage. Können Sie diese Frage bitte klären

    – KARTHI SRV

    29. November 2016 um 13:19 Uhr

1646634848 407 PHP Multidimensional Array Searching Schlussel anhand eines bestimmten Werts finden
Josef

Verwenden Sie diese Funktion:

function searchThroughArray($search,array $lists){
        try{
            foreach ($lists as $key => $value) {
                if(is_array($value)){
                    array_walk_recursive($value, function($v, $k) use($search ,$key,$value,&$val){
                        if(strpos($v, $search) !== false )  $val[$key]=$value;
                    });
            }else{
                    if(strpos($value, $search) !== false )  $val[$key]=$value;
                }

            }
            return $val;

        }catch (Exception $e) {
            return false;
        }
    }

und Anruffunktion.

print_r(searchThroughArray('breville-one-touch-tea-maker-BTM800XL',$products));

function search($array, $key, $value) 
{ 
    $results = array(); 

    if (is_array($array)) 
    { 
        if (isset($array[$key]) && $array[$key] == $value) 
            $results[] = $array; 

        foreach ($array as $subarray) 
            $results = array_merge($results, search($subarray, $key, $value)); 
    } 

    return $results; 
} 

  • Nur-Code-Antworten sind auf StackOverflow von geringem Wert. Bitte aktualisieren Sie Ihren Beitrag, um zu erklären, wie Ihre rekursive Methode funktioniert, in welchen Situationen sie angemessen ist und in Situationen, in denen eine Rekursion unnötig ist. Veröffentlichen Sie Antworten immer mit der Absicht, das OP und das größere SO-Publikum aufzuklären.

    – mickmackusa

    30. Januar 2018 um 2:59 Uhr

1646634848 194 PHP Multidimensional Array Searching Schlussel anhand eines bestimmten Werts finden
Nisse Engström

Ich würde gerne unten tun, wo $products ist das eigentliche Array, das ganz am Anfang im Problem angegeben ist.

print_r(
  array_search("breville-variable-temperature-kettle-BKE820XL", 
  array_map(function($product){return $product["slug"];},$products))
);

  • Nur-Code-Antworten sind auf StackOverflow von geringem Wert. Bitte aktualisieren Sie Ihren Beitrag, um zu erklären, wie Ihre rekursive Methode funktioniert, in welchen Situationen sie angemessen ist und in Situationen, in denen eine Rekursion unnötig ist. Veröffentlichen Sie Antworten immer mit der Absicht, das OP und das größere SO-Publikum aufzuklären.

    – mickmackusa

    30. Januar 2018 um 2:59 Uhr

1646634849 756 PHP Multidimensional Array Searching Schlussel anhand eines bestimmten Werts finden
pawan sen

Versuche dies

function recursive_array_search($needle,$haystack) {
        foreach($haystack as $key=>$value) {
            $current_key=$key;
            if($needle==$value['uid'] OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
                return $current_key;
            }
        }
        return false;
    }

  • Nur-Code-Antworten sind auf StackOverflow von geringem Wert. Bitte aktualisieren Sie Ihren Beitrag, um zu erklären, wie Ihre rekursive Methode funktioniert, in welchen Situationen sie angemessen ist und in Situationen, in denen eine Rekursion unnötig ist. Veröffentlichen Sie Antworten immer mit der Absicht, das OP und das größere SO-Publikum aufzuklären. Ps Ich denke, die meisten PHP-Entwickler werden es vorziehen && und || anstatt AND und OR in deinem Zustand. Es gibt keinen Grund zu deklarieren current_key. Der Vergleich auf $needle sollte streng sein.

    – mickmackusa

    30. Januar 2018 um 3:01 Uhr


963610cookie-checkPHP Multidimensional Array Searching (Schlüssel anhand eines bestimmten Werts finden)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy