Мне нужно получить ключи от значений, которые являются дубликатами. Я попытался использовать 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]);
Вы хотите, чтобы 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] } } }
В array_search()
мы можем читать:
Если игла найдена в стоге сена более одного раза, возвращается первая совпадающая клавиша. Чтобы вернуть ключи для всех совпадающих значений, используйте параметр
array_keys()
с необязательным параметромsearch_value
.
Следующая комбинация вызовов функций даст вам все повторяющиеся значения:
$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
В руководстве по PHP указано в разделе « Return Value
» документации по array_search()
которой вы можете использовать array_keys()
для этого. Вам просто нужно предоставить второй параметр:
$keys = array_keys($list[0], "2009-09-09");
Вы можете достичь этого, используя array_search()
, используя цикл while и следующее обходное решение:
while (($key = array_search("2009-09-09", $list[0])) !== FALSE) { print($key); unset($list[0][$key]); }
сwhile (($key = array_search("2009-09-09", $list[0])) !== FALSE) { print($key); unset($list[0][$key]); }
Источник: реплика в openxbox на php.net
Для array_keys()
многомерного массива вы можете использовать следующую функцию для достижения этого (в качестве альтернативы array_keys()
):
function array_isearch($str, $array){ $found = array(); foreach ($array as $k => $v) { if (strtolower($v) == strtolower($str)) { $found[] = $k; } } return $found; }
Источник: robertark, php.net