PHP mehrdimensionale Array-Suche nach Wert

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

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 0 zurückgeben.

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

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

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

Dies wird funktionieren. Sie sollten es so nennen:

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

Es ist wichtig zu wissen, dass bei der Verwendung des Operators === die verglichenen Typen genau gleich sein müssen, in diesem Beispiel müssen Sie nach string suchen oder einfach == statt === verwenden.

Basierend auf der Antwort von angoru. In neueren Versionen von PHP (>= 5.5.0) können Sie One-Liner verwenden.

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

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

Kommentare (10)

Aufbauend auf Jakub's ausgezeichnete Antwort, hier ist eine allgemeinere Suche, die es erlaubt, den Schlüssel zu spezifizieren (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);

Kommentare (1)

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

Hier's mein Beispiel und bitte beachten Sie, dass dies meine erste Antwort ist. Ich habe das param-Array herausgenommen, weil ich nur ein bestimmtes Array suchen musste, aber man könnte es leicht hinzufügen. Ich wollte im Wesentlichen durch mehr als nur die uid zu suchen.

Außerdem kann es in meiner Situation mehrere Schlüssel geben, die als Ergebnis der Suche nach anderen Feldern zurückgegeben werden, 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 habe ich dies dann so geschrieben, dass ich nach einem anderen Wert und einem anderen assoziativen Schlüssel suchen kann. Mit meinem ersten Beispiel können Sie also nach einem Wert in einem bestimmten assoziativen Schlüssel suchen und alle Übereinstimmungen zurückgeben.

Das zweite Beispiel zeigt Ihnen, wo ein Wert ('Taylor') in einem bestimmten assoziativen Schlüssel (vorname) und ein anderer Wert (wahr) in einem anderen assoziativen Schlüssel (beschäftigt) gefunden wird, und gibt alle Übereinstimmungen zurück (Schlüssel, in denen Personen mit vorname '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 ) 
Kommentare (0)