Изучение нескольких методов проверки существования значения в многомерном массиве с использованием PHP

В 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;
}