Búsqueda de matrices multidimensionales en PHP por valor

Tengo un array en el que quiero buscar el uid y obtener la clave del array.

Ejemplos

Supongamos que tenemos el siguiente array de 2 dimensiones:

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

La llamada a la función search_by_uid(100) (uid del primer usuario) debería devolver 0.

La llamada a la función search_by_uid(40489) debería devolver 2.

He intentado hacer bucles, pero quiero un código de ejecución más rápido.

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

Esto funcionará. Deberías llamarlo así:

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

Es importante saber que si estás usando el operador === los tipos comparados tienen que ser exactamente iguales, en este ejemplo tienes que buscar string o simplemente usar == en lugar de ===.

Basado en la respuesta de angoru. En versiones posteriores de PHP (>= 5.5.0) puedes usar one-liner.

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

Aquí está la documentación: http://php.net/manual/en/function.array-column.php.

Comentarios (10)

Partiendo de la excelente respuesta de Jakub's, aquí hay una búsqueda más generalizada que permitirá especificar la clave (no sólo para el uid):

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

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

Comentarios (1)

Sé que esto ya fue respondido, pero yo utilicé esto y lo extendí un poco más en mi código para que no tuviera que buscar sólo por el uid. Sólo quiero compartirlo para cualquier otra persona que pueda necesitar esa funcionalidad.

Aquí'está mi ejemplo y por favor tenga en cuenta que esta es mi primera respuesta. He quitado la matriz de parámetros porque sólo necesitaba buscar en una matriz específica, pero se podría añadir fácilmente. Quería buscar esencialmente por algo más que el uid.

Además, en mi situación puede haber múltiples claves a devolver como resultado de la búsqueda por otros campos que pueden no ser únicos.

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

Más tarde, terminé escribiendo esto para permitirme buscar otro valor y clave asociativa. Así que mi primer ejemplo permite buscar un valor en cualquier clave asociativa específica, y devolver todas las coincidencias.

Este segundo ejemplo muestra dónde se encuentra un valor ('Taylor') en una determinada clave asociativa (nombre) Y otro valor (verdadero) en otra clave asociativa (empleado), y devuelve todas las coincidencias (Claves donde las personas con nombre 'Taylor' Y están empleadas).

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

Uso de la función

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

**Resultado.

Array ( [0] => 2 ) 
Comentarios (0)