2009-07-31 16 views
18

Necesito obtener las claves de los valores que están duplicados. Intenté usar array_search y funcionó bien, PERO solo obtuve el primer valor como hit.¿Cómo buscar una matriz para valores múltiples en PHP?

Necesito obtener ambas claves de los valores duplicados, en este caso 0 y 2. La salida del resultado de búsqueda como una matriz sería buena.

¿Existe una función de PHP para hacer esto o debo escribir algunos bucles múltiples para hacerlo?

$list[0][0] = "2009-09-09"; 
$list[0][1] = "2009-05-05"; 
$list[0][2] = "2009-09-09"; 
$list[1][0] = "first-paid"; 
$list[1][1] = "1"; 
$list[1][2] = "last-unpaid"; 

echo array_search("2009-09-09",$list[0]); 

Respuesta

25

¿Quieres array_keys con el valor de búsqueda

array_keys($list[0], "2009-09-09"); 

que devolverá una matriz de las teclas con el valor especificado, en su caso [0, 2]. Si también quieres encontrar los duplicados, primero puedes hacer un pase con array_unique, luego iterar sobre esa matriz usando array_keys en el original; cualquier cosa que devuelva una matriz de longitud> 1 es un duplicado, y el resultado son las claves en las que se almacenan los duplicados. Algo así como ...

$uniqueKeys = array_unique($list[0]) 

foreach ($uniqueKeys as $uniqueKey) 
{ 
    $v = array_keys($list[0], $uniqueKey); 

    if (count($v) > 1) 
    { 
    foreach ($v as $key) 
    { 
     // Work with $list[0][$key] 
    } 

    } 
} 
+0

¡Gracias! Copié pegado la primera línea de código. Funciona como se esperaba. –

+0

array_keys Serán de más ayuda – raftaar1191

8

En array_search() podemos leer:

Si no se encuentra la aguja en el pajar más de una vez, la primera clave es coincidente devueltos. Para devolver las claves para todos los valores coincidentes , utilice array_keys() con el parámetro search_value opcional en su lugar.

+0

una matriz es como esto (0 = > (student_id => 10215, roll_no => 23), 1 => (......)) ¿Cómo busco el student_id de la clave que tiene un rollo no? 23. –

7

La siguiente combinación de llamadas de función le dará todos los valores duplicados:

$a = array(1, 1, 2, 3, 4, 5, 99, 2, 5, 2); 

$unique  = array_unique($a); // preserves keys 
$diffkeys = array_diff_key($a, $unique); 
$duplicates = array_unique($diffkeys); 

echo 'Duplicates: ' . join(' ', $duplicates) . "\n"; // 1 2 5 
2

se puede lograr que el uso de utilizando while bucle y la solución siguiente :

while (($key = array_search("2009-09-09", $list[0])) !== FALSE) { 
    print($key); 
    unset($list[0][$key]); 
} 

Fuente: cue at openxbox at php.net

Para matriz de una multidimensional, puede usar la siguiente función para lograr que (como alternativa a array_keys()):

function array_isearch($str, $array){ 
    $found = array(); 
    foreach ($array as $k => $v) { 
    if (strtolower($v) == strtolower($str)) { 
     $found[] = $k; 
    } 
    } 
    return $found; 
} 

Fuente: robertark, php.net

Cuestiones relacionadas