Как искать в массиве несколько значений в PHP? - PullRequest
21 голосов
/ 31 июля 2009

Мне нужно получить ключи от значений, которые являются дубликатами. Я пытался использовать array_search, и это работало нормально, НО я получил только первое значение как хит.

Мне нужно получить оба ключа из повторяющихся значений, в данном случае 0 и 2. Результат поиска в виде массива будет хорошим.

Есть ли функция PHP для этого или мне нужно написать несколько циклов для этого?

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

Ответы [ 5 ]

27 голосов
/ 31 июля 2009

Вы хотите array_keys со значением поиска

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

, который вернет массив ключей с указанным значением, в вашем случае [0, 2]. Если вы также хотите найти дубликаты, вы можете сначала выполнить передачу с помощью array_unique , а затем выполнить итерацию по этому массиву, используя array_keys для оригинала; все, что возвращает массив длиной> 1, является дубликатом, а результатом являются ключи, в которых хранятся дубликаты. Что-то вроде ...

$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]
    }

  }
}
10 голосов
/ 31 июля 2009

В array_search() мы можем прочитать:

Если иголка найдена в стоге сена, больше чем один раз, первый соответствующий ключ вернулся. Чтобы вернуть ключи для всех соответствующие значения, используйте array_keys() с необязательный параметр search_value вместо этого.

7 голосов
/ 31 июля 2009

Следующая комбинация вызовов функций даст вам все повторяющиеся значения:

$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
3 голосов
/ 08 ноября 2015

Этого можно добиться, используя array_search(), используя цикл while и следующий обходной путь:

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

Источник: cue на openxbox на php.net

Для одномерного массива вы можете использовать следующую функцию для достижения этого (в качестве альтернативы array_keys()):

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

Источник: Робертарк, php.net

2 голосов
/ 31 июля 2009

В руководстве PHP в разделе Return Value документации по функции array_search() указано, что для этого можно использовать array_keys(). Вам просто нужно указать второй параметр:

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