Vyhledávání ve vícerozměrném poli v jazyce PHP

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 r...

Poptat web

15. 10. 2025

Vyhledávání ve vícerozměrném poli v jazyce PHP

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íč nebo false pokud 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í s null hodnoty. Použijte isset() 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, zavolejte array_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

Původní článek publikoval Nabil Hassen.