478 Stimmen

PHP mehrdimensionale Array-Suche nach Wert

Ich habe ein Array, in dem ich nach den uid und erhalten den Schlüssel des Arrays.

Beispiele

Angenommen, wir haben das folgende 2-dimensionale 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ückgeben 0 .

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

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

0 Stimmen

Interessanterweise fügen die underscore (und lowdash) librarires diese Funktion zu javascript hinzu...

12 Stimmen

Ich habe ein Skript geschrieben, um die Leistung einiger der Antworten zu testen. Es erzeugt ein Array mit 500k Elementen und sucht darin nach einem Wert im letzten Element. Ich habe eine Funktion wie die akzeptierte Antwort mit den beiden folgenden verglichen array_column Einzeiler-Antworten. Ich habe sie alle so geändert, dass sie das tatsächlich gefundene Array zurückgeben, nicht nur den Schlüssel, weil das normalerweise mein Anwendungsfall ist. Die Funktionsmethode erzielte 0,361, search-col 0,184 und keys-col 0,189 durchschnittliche Mikroverzögerung über 1000 Durchläufe für jede Methode.

664voto

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

Das wird funktionieren. Sie sollten es so nennen:

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

Es ist wichtig zu wissen, dass Sie bei der Verwendung von === Operator verglichenen Typen müssen genau gleich sein, in diesem Beispiel müssen Sie suchen string oder verwenden Sie einfach == stattdessen === .

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

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

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

478voto

angoru Punkte 5599

Wenn Sie (PHP 5 >= 5.5.0) verwenden, müssen Sie dafür keine eigene Funktion schreiben, sondern nur diese Zeile und das war's.

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 mit machen:

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

Wenn Sie PHP < 5.5.0 verwenden, können Sie dieser Backport Danke, Ramsey!

Update: Ich habe ein paar einfache Benchmarks gemacht und das Formular mit mehreren Ergebnissen scheint das schnellste zu sein, sogar schneller als die benutzerdefinierte Funktion von Jakub!

59voto

Iryna Batvina Punkte 1606

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

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

35voto

Sieht aus wie array_filter eine geeignete Lösung für dieses Problem sein wird...

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

33voto

reflexiv Punkte 1633

Aufbauend auf Jakubs ausgezeichnete Antwort Hier ist eine allgemeinere Suche, bei 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;
}

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

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