Wyszukiwanie wartości w tablicach zagnieżdżonych z użyciem generatorów (wyszukiwanie leniwe)
Założenie: Stworzyć funkcję, która efektywnie wyszukuje wartość w dużej, zagnieżdżonej tablicy, unikając jednoczesnego załadowania całej struktury do pamięci.
Krok po kroku:
- Definicja generatora: Stworzymy generator, który iteruje po tablicy zagnieżdżonej i zwraca kolejne elementy. Generator pozwala na przetwarzanie danych “na żądanie”, co jest kluczowe dla dużych zbiorów danych.
- Użycie generatora: Wywołujemy generator i iterujemy po jego wynikach. Jeśli wartość zostanie znaleziona, pętla zostanie przerwana.
- Obsługa braku wartości: Możemy rozszerzyć funkcję o obsługę przypadku, gdy wartość nie zostanie znaleziona.
function recursiveSearch(array $array, $value): Generator
{
foreach ($array as $item) {
if (is_array($item)) {
yield from recursiveSearch($item, $value); // Rekurencyjne wywołanie dla podtablic
} elseif ($item === $value) {
yield $item; // Znaleziono wartość
}
}
}
$nestedArray = [1, [2, [3, 4], 5], 6, [7, 8, [9, 10]]];
$searchValue = 9;
foreach (recursiveSearch($nestedArray, $searchValue) as $foundValue) {
echo "Znaleziono wartość: " . $foundValue . "\n";
break; // Przerwanie pętli po znalezieniu wartości
}
function recursiveSearch(array $array, $value): Generator
{
foreach ($array as $item) {
if (is_array($item)) {
yield from recursiveSearch($item, $value);
} elseif ($item === $value) {
yield $item;
return; // Zakończenie generatora po znalezieniu wartości
}
}
yield null; // Zwrócenie null, jeśli wartość nie została znaleziona
}
foreach (recursiveSearch($nestedArray, 11) as $foundValue) {
if ($foundValue === null) {
echo "Wartość nie została znaleziona.\n";
} else {
echo "Znaleziono wartość: " . $foundValue . "\n";
}
break;
}
Powyższy przykład demonstruje użycie generatorów do efektywnego wyszukiwania wartości w tablicach zagnieżdżonych. Generator pozwala na przetwarzanie danych “na żądanie”, co jest szczególnie ważne w przypadku bardzo dużych struktur danych, gdzie załadowanie całej tablicy do pamięci mogłoby być nieefektywne.
Zachęcamy do eksperymentowania z tym kodem i dalszego zgłębiania tematu generatorów w PHP!