Zvládnutí vyhledávání ve vícerozměrných polích v jazyce PHP
Vyhledávání ve vícerozměrném poli je v jazyce PHP běžnou úlohou při práci se strukturovanými daty, jako jsou odpovědi rozhraní API, konfigurační pole nebo datové sady. V tomto článku se budeme zabývat všemi praktickými metodami, jak efektivně a přesně vyhledávat ve vícerozměrném poli.
1. array_column() + array_search()
Použijete, pokud máte pole asociativních polí a chcete, aby první shoda byla podle určitého sloupce.
$users = [ ['id' => 1, 'name' => 'Alice'], ['id' => 2, 'name' => 'Bob'], ['id' => 3, 'name' => 'Charlie'],]; // get the numeric key of the first element whose 'name' === 'Bob'$keys = array_column($users, 'name');$key = array_search('Bob', $keys, true); // use strict mode when you care about types if ($key !== false) { echo "User found: ID " . $users[$key]['id'];} else { echo "User not found.";}
Poznámky:
array_column()extrahuje ze vstupu sloupec s hodnotou; volitelně lze zadat třetí parametr, který vrátí pole s indexem podle jiného sloupce.array_search()vrátí první odpovídající klíč nebofalsepokud není nalezen; použijte třetí ($strict) vynutit===srovnání.
2. foreach smyčka
Pokud potřebujete vyhledávat podle více kritérií nebo na více úrovních, jednoduchá smyčka vám poskytne plnou kontrolu.
$products = [ ['id' => 10, 'name' => 'Laptop', 'category' => 'Electronics'], ['id' => 11, 'name' => 'Desk', 'category' => 'Furniture'], ['id' => 12, 'name' => 'Chair', 'category' => 'Furniture'],]; $result = null;foreach ($products as $product) { if ($product['id'] === 11) { $result = $product; break; }} if ($result) { echo "Product found: {$result['name']}";} else { echo "Product not found.";}
Tento přístup je nejflexibilnější, můžete přidávat složité podmínky, vnořené kontroly nebo částečné shody. Je také jednodušší na ladění.
3. array_filter()
array_filter() vrátí všechny prvky, pro které zpětné volání vrátí true. Klíče jsou zachovány; použijte array_values() přeindexovat, pokud chcete mít výsledné pole s nulou.
$itEmployees = array_filter($employees, function($employee) { return isset($employee['department']) && $employee['department'] === 'IT';});
array_filter() přijímá volitelný režim pro předání klíčů zpětnému volání; ve výchozím nastavení klíče zachovává.
4. Rekurzivní vyhledávání hluboko vnořených polí (podle klíče/hodnoty)
Pokud je hloubka struktury nepředvídatelná, použijte rekurzivní funkci, která zkoumá každou úroveň. Tento příklad vrací první odpovídající kontejner (asociativní pole), které obsahuje daný key => value dvojice.
function searchArrayByKeyValue(array $haystack, string $key, $value) { foreach ($haystack as $element) { if (!is_array($element)) { continue; } if (array_key_exists($key, $element) && $element[$key] === $value) { return $element; } // Recurse into nested arrays $found = searchArrayByKeyValue($element, $key, $value); if ($found !== null) { return $found; } } return null;}
Poznámky k provádění:
- Použijte
array_key_exists()když potřebujete zjistit klíče, které existují snullhodnoty. Použijteisset()pro kontroly, které nejsou nulové. - Použijte striktní porovnávání (
===), pokud nechcete záměrně použít vynucení typu.
5. Rekurzivní vyhledávání pouze podle hodnoty (libovolný klíč)
Kontrola, zda skalární hodnota existuje kdekoli ve vícerozměrné struktuře:
function inMultiArray($needle, array $haystack): bool { foreach ($haystack as $value) { if (is_array($value)) { if (inMultiArray($needle, $value)) { return true; } continue; } if ($value === $needle) { // strict comparison return true; } } return false;} $array = [ ['x' => [1, 2, 3]], ['y' => [4, 5, 6]],]; var_dump(inMultidimensionalArray(5, $array)); // true
Pokud potřebujete testovat pouze hodnoty nejvyšší úrovně, upřednostněte možnost in_array() s $strict vlajka. Pro hluboké struktury použijte rekurzi.
6. Vyhledávání podle více podmínek
Kontroly můžete kombinovat uvnitř array_filter() nebo smyčky. Příklad použití array_filter() najít studenty s grade === 'A' a age === 18:
$students = [ ['name' => 'Sara', 'grade' => 'A', 'age' => 17], ['name' => 'Tom', 'grade' => 'B', 'age' => 18], ['name' => 'Liam', 'grade' => 'A', 'age' => 18],]; $result = array_filter($students, function($student) { return $student['grade'] === 'A' && $student['age'] === 18;}); print_r($result);
Výkonnost a osvědčené postupy
- Vestavěné funkce (
array_column,array_search,array_filter) jsou implementovány v jazyce C a jsou často rychlejší a přehlednější než ekvivalentní smyčky PHP. V případě potřeby je používejte. - Preferuji
===/přísné porovnávání při porovnávání hodnot z externích zdrojů, aby nedocházelo k překvapivým shodám. array_filter()zachovává klíče, zavolejtearray_values()pokud se spoléháte na číselné, souvislé indexy.- Pro velmi rozsáhlé soubory dat zvažte použití generátorů (
yield) nebo streamování namísto načítání všeho do paměti.
Souhrnná tabulka
| Úkol | Doporučený přístup |
|---|---|
| Jednotlivá shoda podle sloupce (jedna úroveň) | array_column() + array_search() |
| Všechny zápasy s podmínkou | array_filter() (pak array_values() v případě potřeby) |
| Komplexní/vícepolová logika | foreach s break/continue |
| Neznámé hloubkové vyhledávání podle klíče/hodnoty | Rekurzivní vyhledávací funkce |
| Hodnota existuje kdekoli | Rekurzivní inMultiArray() or in_array() pro mělká pole |