PHP mehrdimensionale Array-Suche nach Wert

Lesezeit: 9 Minuten

PHP mehrdimensionale Array Suche nach Wert
Rachit

Ich habe ein Array, in dem ich suchen möchte uid und erhalten Sie den Schlüssel des Arrays.

Beispiele

Angenommen, wir haben das folgende zweidimensionale Array:

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )
);

Der Funktionsaufruf search_by_uid(100) (uid des ersten Benutzers) sollte zurückkehren 0.

Der Funktionsaufruf search_by_uid(40489) sollte zurückkehren 2.

Ich habe versucht, Schleifen zu erstellen, aber ich möchte einen schneller ausgeführten Code.

  • Interessanterweise fügen die Unterstrich- (und Lowdash-) Bibliotheken diese Funktion zu Javascript hinzu …

    – ErichBSchulz

    7. März 2014 um 12:37 Uhr

  • Ich habe ein Skript geschrieben, um die Leistung einiger Antworten zu testen. Es generiert ein Array von Arrays mit 500.000 Mitgliedern und durchsucht es nach einem Wert im letzten Mitglied. Ich habe eine Funktion wie die akzeptierte Antwort mit den beiden verglichen array_column einzeilige Antworten. Ich habe sie alle geändert, um das tatsächlich entdeckte Array zurückzugeben, nicht nur den Schlüssel, da dies normalerweise mein Anwendungsfall ist. Die Funktionsmethode erzielte 0,361, Suchspalte 0,184 und Schlüsselspalte 0,189 durchschnittliche Mikroverzögerung über 1000 Läufe für jede Methode.

    – Josch

    14. Februar 2016 um 12:49 Uhr

1647075248 72 PHP mehrdimensionale Array Suche nach Wert
Jakub Truneček

function searchForId($id, $array) {
   foreach ($array as $key => $val) {
       if ($val['uid'] === $id) {
           return $key;
       }
   }
   return null;
}

Das wird funktionieren. Du solltest es so nennen:

$id = searchForId('100', $userdb);

Es ist wichtig zu wissen, dass, wenn Sie verwenden === Operator verglichene Typen müssen genau gleich sein, in diesem Beispiel müssen Sie suchen string oder einfach verwenden == stattdessen ===.

Beyogen auf angoru Antworten. In späteren Versionen von PHP (>= 5.5.0) können Sie Einzeiler verwenden.

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

Hier ist Dokumentation: http://php.net/manual/en/function.array-column.php.

  • Sie sollten dies auch ohne PHP 5.5 in einem Einzeiler tun können, indem Sie array_map anstelle von array_column verwenden. Einfach ersetzen array_column($userdb, 'uid') mit array_map(function($v){return $v['uid'];},$userdb)

    – Jesse Grün

    23. Februar 2016 um 18:12 Uhr

  • Ja, du hast recht. Lambda-Funktionen sind seit PHP 5.3 verfügbar. und besser ist array_searchnicht wahr?

    – Jakub Truneček

    25. Februar 2016 um 12:43 Uhr

  • @angoru Ich denke, die ursprüngliche Lösung (die foreach Schleife) wird schneller ausgeführt, da sie stoppt, sobald eine Übereinstimmung gefunden wird. Die neuere Lösung muss das gesamte Array einmal durchlaufen, um es zu extrahieren array_column, durchlaufen Sie es dann ein zweites Mal, um die Suche durchzuführen (bis es eine Übereinstimmung findet). Die neuere Lösung ist einfacher zu lesen und prägnanter, aber das OP hat die Leistung speziell als Problem angesprochen

    – BeetleJuice

    27. Juli 2017 um 17:19 Uhr


  • @JakubTruneček . Ich habe etwas mit dem gleichen Array zu tun, das in der Frage angegeben ist. Ich möchte den Namen des Benutzers aus dem Array, indem ich die ID übergebe. Die Funktion findUserName(40489) sollte „Michael“ zurückgeben. Wie ist das möglich?

    – Ashok Gujjar

    31. August 2018 um 6:40 Uhr

  • @JakubTruneček Hallo, ich bin diesem Problem in meinem Code begegnet, aber ich habe eine ganz andere Sache. In meinem Fall ist der ‘uid’-Wert mehrfach vorhanden, daher muss ich ein Array mit fundierten Schlüsseln abrufen.

    – Bhavin Thummar

    25. September 2018 um 11:54 Uhr


PHP mehrdimensionale Array Suche nach Wert
angoru

Wenn Sie (PHP 5 >= 5.5.0) verwenden, müssen Sie dafür keine eigene Funktion schreiben, schreiben Sie einfach diese Zeile und fertig.

Wenn Sie nur ein Ergebnis wünschen:

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

Für mehrere Ergebnisse

$keys = array_keys(array_column($userdb, 'uid'), 40489);

Falls Sie ein assoziatives Array haben, wie in den Kommentaren angegeben, können Sie es machen mit:

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);

Wenn Sie PHP < 5.5.0 verwenden, können Sie verwenden dieser Backportdanke ramsey!

Update: Ich habe einige einfache Benchmarks erstellt und das Formular für mehrere Ergebnisse scheint das schnellste zu sein, sogar schneller als die benutzerdefinierte Jakub-Funktion!

  • Was ist, wenn der gesuchte Wert (in diesem Beispiel 40489) mehr als einmal vorkommt und ich alle Schlüssel erhalten möchte, die darin erscheinen?

    – Dimitris Papageorgiou

    15. Mai 2015 um 9:13 Uhr

  • Wenn der Wert 40489 mehr als einmal im Array vorkommt, gibt die Funktion ein Array von Schlüsseln zurück … ?? @angoru

    – Jishan

    19. Mai 2015 um 8:23 Uhr

  • Dies hat bei mir nicht funktioniert, als der Schlüssel in der $userdb nicht mit 0,1, 2 usw. begann und sagte, der Schlüssel sei 1234,4566 usw. Die resultierenden Schlüssel nach der array_search sind immer 0,1,2 und so an

    – Kaushtuv

    11. April 2016 um 6:41 Uhr


  • Dies funktioniert nicht mit einem assoziativen Array, aber Sie können das folgendermaßen umgehen: array_search(40489, array_combine(array_keys($userdb), array_column($userdb, 'uid')))

    – John Mellor

    2. Juni 2017 um 5:53 Uhr

  • Hinweis: Wenn kein Fall gefunden wird, kehrt die erste Anweisung zurück false und die nächsten beiden Anweisungen geben ein leeres Array zurück [].

    – Nabi KAZ

    24. Januar 2020 um 20:06 Uhr

1647075249 280 PHP mehrdimensionale Array Suche nach Wert
Iryna Batwina

In späteren Versionen von PHP (>= 5.5.0) können Sie diesen Einzeiler verwenden:

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

  • Fügen Sie einfach das Ergebnis von array_column in eine bestimmte Variable ein, um zu vermeiden, dass array_column für jedes Ergebnis im Array aufgerufen wird.

    – Maikonn

    8. Oktober 2019 um 21:07 Uhr

1647075249 673 PHP mehrdimensionale Array Suche nach Wert
reflexiv

Aufbauend auf Jakubs ausgezeichneter Antwort ist hier eine allgemeinere Suche, mit der der Schlüssel angegeben werden kann (nicht nur für uid):

function searcharray($value, $key, $array) {
   foreach ($array as $k => $val) {
       if ($val[$key] == $value) {
           return $k;
       }
   }
   return null;
}

Verwendungszweck: $results = searcharray('searchvalue', searchkey, $array);

PHP mehrdimensionale Array Suche nach Wert
BEJGAM SHIVA PRASAD

Sieht aus array_filter wird eine geeignete Lösung dafür sein …

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

PHP-Code

<?php 
$search = 5465;
$found = array_filter($userdb,function($v,$k) use ($search){
  return $v['uid'] == $search;
},ARRAY_FILTER_USE_BOTH); // With latest PHP third parameter is optional.. Available Values:- ARRAY_FILTER_USE_BOTH OR ARRAY_FILTER_USE_KEY  

$values= print_r(array_values($found));
$keys =  print_r(array_keys($found)); 

  • @BEJAM SHIVA PRASAD könnten Sie mir bitte mit diesem stackoverflow.com/questions/44721195/… helfen?

    – Walai

    23. Juni 2017 um 13:38 Uhr

  • zeigt einen Fehler:syntax error, unexpected '=>' (T_DOUBLE_ARROW), expecting ';'

    – Schihas

    11. April 2018 um 11:21 Uhr


  • Können Sie bitte weitere Informationen einfügen? Ich meine, welche Zeile und Ihre Code- und Array-Struktur.

    – BEJGAM SHIVA PRASAD

    12. April 2018 um 4:01 Uhr

  • @Shihas Ich habe die Antwort aktualisiert, ich bin sicher, dass es gelöst wird.

    – BEJGAM SHIVA PRASAD

    7. August 2019 um 4:10 Uhr

1647075250 651 PHP mehrdimensionale Array Suche nach Wert
Nadeem0035

Ich weiß, dass dies bereits beantwortet wurde, aber ich habe dies verwendet und in meinem Code etwas mehr erweitert, sodass Sie nicht nur nach der uid suchen mussten. Ich möchte es nur für alle anderen freigeben, die diese Funktionalität benötigen.

Hier ist mein Beispiel und bitte bedenken Sie, dass dies meine erste Antwort ist. Ich habe das param-Array herausgenommen, weil ich nur ein bestimmtes Array durchsuchen musste, aber Sie es einfach hinzufügen konnten. Ich wollte im Wesentlichen nach mehr als nur der uid suchen.

In meiner Situation können auch mehrere Schlüssel zurückgegeben werden, wenn nach anderen Feldern gesucht wird, die möglicherweise nicht eindeutig sind.

 /**
     * @param array multidimensional 
     * @param string value to search for, ie a specific field name like name_first
     * @param string associative key to find it in, ie field_name
     * 
     * @return array keys.
     */
     function search_revisions($dataArray, $search_value, $key_to_search) {
        // This function will search the revisions for a certain value
        // related to the associative key you are looking for.
        $keys = array();
        foreach ($dataArray as $key => $cur_value) {
            if ($cur_value[$key_to_search] == $search_value) {
                $keys[] = $key;
            }
        }
        return $keys;
    }

Später schrieb ich dies, damit ich nach einem anderen Wert und assoziativen Schlüssel suchen konnte. In meinem ersten Beispiel können Sie also nach einem Wert in einem bestimmten assoziativen Schlüssel suchen und alle Übereinstimmungen zurückgeben.

Dieses zweite Beispiel zeigt Ihnen, wo ein Wert (‘Taylor’) in einem bestimmten assoziativen Schlüssel (first_name) zu finden ist. UND ein anderer Wert (wahr) wird in einem anderen assoziativen Schlüssel (beschäftigt) gefunden und gibt alle Übereinstimmungen zurück (Schlüssel, bei denen Personen mit dem Vornamen „Taylor“ UND beschäftigt sind).

/**
 * @param array multidimensional 
 * @param string $search_value The value to search for, ie a specific 'Taylor'
 * @param string $key_to_search The associative key to find it in, ie first_name
 * @param string $other_matching_key The associative key to find in the matches for employed
 * @param string $other_matching_value The value to find in that matching associative key, ie true
 * 
 * @return array keys, ie all the people with the first name 'Taylor' that are employed.
 */
 function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) {
    // This function will search the revisions for a certain value
    // related to the associative key you are looking for.
    $keys = array();
    foreach ($dataArray as $key => $cur_value) {
        if ($cur_value[$key_to_search] == $search_value) {
            if (isset($other_matching_key) && isset($other_matching_value)) {
                if ($cur_value[$other_matching_key] == $other_matching_value) {
                    $keys[] = $key;
                }
            } else {
                // I must keep in mind that some searches may have multiple
                // matches and others would not, so leave it open with no continues.
                $keys[] = $key;
            }
        }
    }
    return $keys;
}

Verwendung der Funktion

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);

Ergebnis

Array ( [0] => 2 ) 

  • @BEJAM SHIVA PRASAD könnten Sie mir bitte mit diesem stackoverflow.com/questions/44721195/… helfen?

    – Walai

    23. Juni 2017 um 13:38 Uhr

  • zeigt einen Fehler:syntax error, unexpected '=>' (T_DOUBLE_ARROW), expecting ';'

    – Schihas

    11. April 2018 um 11:21 Uhr


  • Können Sie bitte weitere Informationen einfügen? Ich meine, welche Zeile und Ihre Code- und Array-Struktur.

    – BEJGAM SHIVA PRASAD

    12. April 2018 um 4:01 Uhr

  • @Shihas Ich habe die Antwort aktualisiert, ich bin sicher, dass es gelöst wird.

    – BEJGAM SHIVA PRASAD

    7. August 2019 um 4:10 Uhr

Sie können dies mit einer Kombination aus zwei Funktionen tun, array_search & array_column.

$search_value="5465";
$search_key   = 'uid';
$user = array_search($search_value, array_column($userdb, $search_key));

print_r($userdb[$user]);

5465 ist die Benutzer-ID, die Sie suchen möchten, Flüssigkeit ist der Schlüssel, der die Benutzer-ID und enthält $userdb ist das Array, das in der Frage definiert ist.

Verweise:

array_search auf php.net

array_column auf php.net

993200cookie-checkPHP mehrdimensionale Array-Suche nach Wert

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

Privacy policy