Wie kann überprüft werden, ob ein bestimmter Wert an einem bestimmten Schlüssel in einem beliebigen Subarray eines mehrdimensionalen Arrays vorhanden ist?

Lesezeit: 6 Minuten

Benutzeravatar von Rob
rauben

Ich muss ein mehrdimensionales Array nach einem bestimmten Wert in einem der indizierten Subarrays durchsuchen.

Mit anderen Worten, ich muss eine einzelne Spalte des mehrdimensionalen Arrays auf einen Wert überprüfen. Wenn der Wert irgendwo im mehrdimensionalen Array vorhanden ist, möchte ich zurückkehren true Andernfalls false

$my_array = array(    
    0 =>  array(  
        "name"   => "john",  
        "id"    =>  4  
    ),  
    1   =>  array(  
        "name" =>  "mark",  
        "id" => 152  
    ), 
    2   =>  array(  
        "name" =>  "Eduard",  
        "id" => 152  
    )
);

Ich würde gerne wissen, wie ich am schnellsten und effizientesten überprüfen kann, ob das Array $my_array enthält einen Wert mit dem Schlüssel “id”. Zum Beispiel, wenn id => 152 Irgendwo im mehrdimensionalen Array möchte ich true.

  • So erhalten Sie die Schlüsselnummern der Fund-IDs. zB wird das Ergebnis sein 1,2 wenn wir suchen id = 152. @mickmackusa, @Rob

    – manas paul

    20. September 2022 um 7:58 Uhr


  • Hallo @mickmackusa, kannst du das bitte für mich auf dem obigen Array machen? Auch ist die array_filter() ist schneller zu suchen als die foreach? Weil ich ein größeres Array habe, um mit demselben Schlüssel zu suchen.

    – manas paul

    20. September 2022 um 10:15 Uhr

  • @manas Ich nehme an, du willst Dieser Bitte entfernen Sie alle anderen Kommentare, mit denen Sie die Seite übersät haben. Wenn Sie mehrere Werte wünschen, geben Sie einfach nicht stackoverflow.com/a/16439674/2943403 zurück oder unterbrechen Sie es

    – mickmackusa

    20. September 2022 um 13:13 Uhr

Nichts ist schneller als eine einfache Schleife. Sie können dazu einige Array-Funktionen mischen und anpassen, aber sie werden auch nur als Schleife implementiert.

function whatever($array, $key, $val) {
    foreach ($array as $item)
        if (isset($item[$key]) && $item[$key] == $val)
            return true;
    return false;
}

  • So erhalten Sie die Schlüsselnummern der Fund-IDs. zB wird das Ergebnis sein 1,2 wenn wir suchen id = 152. @Dan Grossmann

    – manas paul

    20. September 2022 um 8:00 Uhr

Benutzeravatar von Jazzer
Jazzer

Der einfachste Weg ist dieser:

$my_array = array(    
    0 =>  array(  
        "name"   => "john",  
        "id"    =>  4  
    ),  
    1   =>  array(  
        "name" =>  "mark",  
        "id" => 152  
    ), 
    2   =>  array(  
        "name" =>  "Eduard",  
        "id" => 152  
    )
);

if (array_search(152, array_column($my_array, 'id')) !== FALSE) {
  echo 'FOUND!';
} else {
  echo 'NOT FOUND!';
}

  • Wie erhalte ich die Schlüsselwerte (1 und 2) des gesuchten id(152)-Werts?

    – manas paul

    19. September 2022 um 16:31 Uhr


Benutzeravatar von Manuel Pardo
Manuel Pardo

** PHP >= 5.5

einfach kannst du das verwenden

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

Nehmen wir dieses mehrdimensionale Array an:

$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'));

  • Warum nicht einfach $ids = array_column($array, 'id', 'id'); und dann isset($ids[40489])?

    – Elias Van Ootegem

    11. August 2016 um 15:33 Uhr

  • Hey, macht es Ihnen etwas aus, Ihre Antwort zu aktualisieren und den Kommentar von Elias zu implementieren?

    – Leymannx

    16. Februar 2017 um 9:12 Uhr

  • Es ist wichtig, dies für zukünftige Forscher zu klären $key vielleicht 0 was ein falscher Wert ist. Um zu wissen, ob array_search() qualifizierende Daten gefunden haben, müssen Sie explizit prüfen, ob $key !== false oder $key === false je nach Bedarf.

    – mickmackusa

    18. Mai 2020 um 10:26 Uhr

Benutzeravatar von Friendly Code
Freundlicher Code

Hier ist eine aktualisierte Version von Dan Grossmans Antwort, die mehrdimensionale Arrays berücksichtigt (wonach ich gesucht habe):

function find_key_value($array, $key, $val)
{
    foreach ($array as $item)
    {
        if (is_array($item) && find_key_value($item, $key, $val)) return true;

        if (isset($item[$key]) && $item[$key] == $val) return true;
    }

    return false;
}

Benutzeravatar von stewe
Eintopf

Wenn Sie viele “id”-Lookups machen müssen und es wirklich schnell gehen soll, sollten Sie ein zweites Array verwenden, das alle “ids” als Schlüssel enthält:

$lookup_array=array();

foreach($my_array as $arr){
    $lookup_array[$arr['id']]=1;
}

Jetzt können Sie sehr schnell nach einer vorhandenen ID suchen, zum Beispiel:

echo (isset($lookup_array[152]))?'yes':'no';

Eine gute Lösung kann von bereitgestellt werden @Elias Van Ootegan in einem Kommentar, der lautet:

$ids = array_column($array, 'id', 'id');
echo isset($ids[40489])?"Exist":"Not Exist";

Ich habe es versucht und für mich gearbeitet, danke Kumpel.

Bearbeitet

Hinweis: Es funktioniert in PHP 5.5+

TMTOWTDI. Hier sind einige Lösungen in der Reihenfolge ihrer Komplexität.

(Es folgt eine kurze Einführung in die Komplexität):O(n) oder “großes o” bedeutet am schlimmsten Fallbeispiel wo n bedeutet die Anzahl der Elemente im Array und o(n) oder “kleines o” bedeutet Beste Fall Szenario. Lange diskrete Mathematikgeschichte, kurz gesagt, Sie man muss sich nur um das Worst-Case-Szenario kümmernund stellen Sie sicher, dass dies nicht der Fall ist n ^ 2 oder n!. Es ist eher ein Maß für die Änderung der Rechenzeit als n größer als die Gesamtrechenzeit. Wikipedia hat einen guten Artikel über Rechen- bzw. Zeitkomplexität.

Wenn mich die Erfahrung eines gelehrt hat, dann ist es, dass es eine deutliche Zeitverschwendung ist, zu viel Zeit damit zu verbringen, das little-o Ihrer Programme zu optimieren.

Lösung 0: O(n) / o(1) Komplexität:

Diese Lösung hat ein Best-Case-Szenario von 1 Vergleich – 1 Iteration durch die Schleife, aber nur vorausgesetzt, der passende Wert steht an Position 0 des Arrays. Im schlimmsten Fall ist es nicht im Array und muss daher über jedes Element des Arrays iterieren.

foreach ($my_array as $sub_array) {
    if (@$sub_array['id'] === 152) {
        return true;
    }
}
return false;

Lösung 1: O(n) / o(n) Komplexität:

Diese Lösung muss das gesamte Array durchlaufen, unabhängig davon, wo sich der übereinstimmende Wert befindet, also wird es immer sein n Iterationen durch das Array.

return 0 < count(
    array_filter(
        $my_array,
        function ($a) {
            return array_key_exists('id', $a) && $a['id'] == 152;
        }
    )
);

Lösung 2: O(n log n) / o(n log n) Komplexität:

Eine Hash-Einfügung ist, wo die log n kommt von; n Hash-Einfügungen = n * log n. Am Ende gibt es eine Hash-Suche, die eine andere ist log n aber es ist nicht enthalten, weil diskrete Mathematik genau so funktioniert.

$existence_hash = [];
foreach ($my_array as $sub_array) {
    $existence_hash[$sub_array['id']] = true;
}
return @$existence_hash['152'];

  • Gießen array_filter()‘s Rückgabewert als (bool) erspart Ihnen das Zählen oder Vergleichen der Ergebnisse 0. 3v4l.org/2dVAu Für alle, die nach der effizientesten Technik (und dem OP) suchen, die sie verwendet array_filter() wird das Eingabearray weiter durchlaufen, auch nachdem eine Übereinstimmung gefunden wurde, sodass dies nicht der beste Weg ist.

    – mickmackusa

    18. Mai 2020 um 7:50 Uhr

  • Die count() Anruf ist ein O(1) Operation, daher gibt es keine Optimierung durch die Verwendung einer Umwandlung. Auch wenn Sie es als Kurzschluss schreiben for Schleife, wäre das Worst-Case-Szenario immer noch O(n) da die ID in nicht existieren konnte $my_array.

    – Amphetamaschine

    18. Mai 2020 um 17:57 Uhr

  • Durch die Umstellung auf (bool) es gibt keinen Funktionsaufruf und keinen bedingten Vergleich array_filter()den Rückgabewert von , sodass die Konvertierung in den booleschen Typ direkter und präziser ist. Die Technik von DanGrossman (obwohl ich geschweifte Klammern für alle Sprachkonstrukte verwenden würde) wird die beste Leistung erbringen, da sie eine bedingte frühe Rückkehr/Unterbrechung ausführt. Ich bin sicher, Sie wissen das bereits; Ich stelle diese Tatsache nur für Forscher fest. Bitte fügen Sie eine Erklärung zu Ihrer Antwort zum Vorbild für besseres Posting-Verhalten für neuere Benutzer hinzu.

    – mickmackusa

    18. Mai 2020 um 21:46 Uhr

1440970cookie-checkWie kann überprüft werden, ob ein bestimmter Wert an einem bestimmten Schlüssel in einem beliebigen Subarray eines mehrdimensionalen Arrays vorhanden ist?

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

Privacy policy