Αναζήτηση πολυδιάστατου πίνακα PHP με βάση την τιμή

Έχω έναν πίνακα όπου θέλω να αναζητήσω το uid και να πάρω το κλειδί του πίνακα.

Παραδείγματα

Έστω ότι έχουμε τον ακόλουθο δισδιάστατο πίνακα:

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

Η κλήση της συνάρτησης search_by_uid(100) (uid του πρώτου χρήστη) θα πρέπει να επιστρέφει 0.

Η κλήση της συνάρτησης search_by_uid(40489) θα πρέπει να επιστρέφει 2.

Δοκίμασα να φτιάξω βρόχους, αλλά θέλω έναν κώδικα που να εκτελείται γρηγορότερα.

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

Αυτό θα λειτουργήσει. Θα πρέπει να το καλέσετε ως εξής:

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

Είναι σημαντικό να γνωρίζετε ότι αν χρησιμοποιείτε τον τελεστή === οι συγκρινόμενοι τύποι πρέπει να είναι ακριβώς ίδιοι, σε αυτό το παράδειγμα πρέπει να αναζητήσετε string ή απλά να χρησιμοποιήσετε == αντί για ===.

Με βάση την απάντηση angoru. Σε μεταγενέστερες εκδόσεις της PHP (>= 5.5.0) μπορείτε να χρησιμοποιήσετε το one-liner.

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

Εδώ είναι η τεκμηρίωση: http://php.net/manual/en/function.array-column.php.

Σχόλια (10)

Με βάση την εξαιρετική απάντηση του Jakub's, εδώ είναι μια πιο γενικευμένη αναζήτηση που θα επιτρέπει το κλειδί να καθοριστεί (όχι μόνο για uid):

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

Χρήση: $results = searcharray('searchvalue', searchkey, $array);

Σχόλια (1)

Ξέρω ότι αυτό έχει ήδη απαντηθεί, αλλά το χρησιμοποίησα και το επέκτεινα λίγο περισσότερο στον κώδικά μου, ώστε να μην χρειάζεται αναζήτηση μόνο με βάση το uid. Απλά θέλω να το μοιραστώ για όποιον άλλο μπορεί να χρειαστεί αυτή τη λειτουργικότητα.

Εδώ'είναι το παράδειγμά μου και παρακαλούμε να έχετε κατά νου ότι αυτή είναι η πρώτη μου απάντηση. Έβγαλα τον πίνακα παραμέτρων επειδή χρειαζόμουν μόνο αναζήτηση σε έναν συγκεκριμένο πίνακα, αλλά θα μπορούσατε εύκολα να τον προσθέσετε. Ήθελα ουσιαστικά να κάνω αναζήτηση με βάση περισσότερα από το uid.

Επίσης, στην περίπτωσή μου μπορεί να υπάρχουν πολλαπλά κλειδιά που πρέπει να επιστραφούν ως αποτέλεσμα της αναζήτησης από άλλα πεδία που μπορεί να μην είναι μοναδικά.

 /**
     * @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;
    }

Αργότερα, κατέληξα να γράψω αυτό για να μπορέσω να αναζητήσω μια άλλη τιμή και ένα συσχετιστικό κλειδί. Έτσι, το πρώτο μου παράδειγμα σας επιτρέπει να αναζητήσετε μια τιμή σε οποιοδήποτε συγκεκριμένο συσχετιστικό κλειδί και να επιστρέψετε όλες τις αντιστοιχίες.

Αυτό το δεύτερο παράδειγμα σας δείχνει πού μια τιμή ('Taylor') βρίσκεται σε ένα συγκεκριμένο συσχετιστικό κλειδί (first_name) ΚΑΙ μια άλλη τιμή (true) βρίσκεται σε ένα άλλο συσχετιστικό κλειδί (employed), και επιστρέφει όλες τις αντιστοιχίες (Keys where people with first name 'Taylor' AND are employed).

/**
 * @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;
}

Χρήση της συνάρτησης

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

Αποτέλεσμα

Array ( [0] => 2 ) 
Σχόλια (0)