В PHP работа с многомерными массивами — обычная задача. Часто вам может потребоваться проверить, существует ли определенное значение в таком массиве. В этой статье мы рассмотрим несколько методов достижения этой цели, каждый со своим примером кода. К концу вы получите в свое распоряжение множество методов эффективной проверки существования значения в многомерном массиве.
Метод 1: рекурсивная функция
Один из способов проверить значение в многомерном массиве — использовать рекурсивную функцию. Этот метод позволяет рекурсивно выполнять поиск по всем уровням массива, пока не будет найдено нужное значение.
function searchValueRecursive($array, $value) {
foreach ($array as $key => $element) {
if ($element === $value || (is_array($element) && searchValueRecursive($element, $value))) {
return true;
}
}
return false;
}
Метод 2: итерационный подход с array_walk_recursive
Другой метод предполагает использование функции array_walk_recursive
, которая рекурсивно применяет определяемую пользователем функцию ко всем элементам массива.
function searchValueIterative($array, $value) {
$found = false;
array_walk_recursive($array, function ($element) use (&$found, $value) {
if ($element === $value) {
$found = true;
}
});
return $found;
}
Метод 3: сглаживание и использование in_array
Другой подход заключается в сведении многомерного массива в одномерный массив, а затем с помощью функции in_array
для проверки нужного значения.
function searchValueFlatten($array, $value) {
$flattenArray = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
return in_array($value, iterator_to_array($flattenArray), true);
}
Метод 4: кодирование JSON
Вы можете преобразовать многомерный массив в строку JSON, а затем использовать функцию strpos
для поиска значения в строке JSON.
function searchValueJson($array, $value) {
$jsonString = json_encode($array);
return strpos($jsonString, $value) !== false;
}
Метод 5: собственный рекурсивный итератор
Наконец, вы можете создать собственный рекурсивный итератор, который обходит многомерный массив и сравнивает каждый элемент с желаемым значением.
class RecursiveValueSearch extends RecursiveIteratorIterator {
private $value;
public function __construct($iterator, $value) {
parent::__construct($iterator);
$this->value = $value;
}
public function accept() {
return $this->current() === $this->value;
}
}
function searchValueCustomRecursive($array, $value) {
$iterator = new RecursiveArrayIterator($array);
$search = new RecursiveValueSearch($iterator, $value);
return iterator_count($search) > 0;
}