Pregunta

Necesito obtener las claves de valores que son duplicados. Traté de usar array_search y funcionó bien, PERO solo obtuve el primer valor como hit.

Necesito obtener ambas claves de los valores duplicados, en este caso 0 y 2. El resultado de la búsqueda como matriz sería bueno.

¿Hay una función PHP para hacer esto o necesito 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]);
¿Fue útil?

Solución

Desea array_keys con el valor de búsqueda

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

que devolverá una matriz de claves con el valor especificado, en su caso [0, 2]. Si también desea encontrar los duplicados, primero puede hacer un pase con array_unique , luego itere sobre esa matriz usando array_keys en el original; todo lo que devuelve 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]
    }

  }
}

Otros consejos

En array_search () nosotros puede leer:

  

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

La siguiente combinación de llamadas a funciones 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

Puede lograrlo usando array_search () usando mientras loop y la siguiente solución alternativa:

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

Fuente: señal en openxbox en php.net

Para una matriz multidimensional, puede usar la siguiente función para lograr eso (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

El manual de PHP establece en el < code> Valor devuelto de la sección array_search () documentación de la función que puede usar array_keys () para lograr esto. Solo necesita proporcionar el segundo parámetro:

$keys = array_keys($list[0], "2009-09-09");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top