Code :
function search($array, $key, $value)
{
$results = array();
if (is_array($array)) {
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search($subarray, $key, $value));
}
}
return $results;
}
$arr = array(0 => array(id=>1,name=>"cat 1"),
1 => array(id=>2,name=>"cat 2"),
2 => array(id=>3,name=>"cat 1"));
print_r(search($arr, 'name', 'cat 1'));
Sortie :
Array
(
[0] => Array
(
[id] => 1
[name] => cat 1
)
[1] => Array
(
[id] => 3
[name] => cat 1
)
)
Si l'efficacité est importante, vous pouvez l'écrire de façon à ce que tous les appels récursifs stockent leurs résultats dans le même fichier temporaire. $results
plutôt que de fusionner des tableaux ensemble, comme ceci :
function search($array, $key, $value)
{
$results = array();
search_r($array, $key, $value, $results);
return $results;
}
function search_r($array, $key, $value, &$results)
{
if (!is_array($array)) {
return;
}
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
search_r($subarray, $key, $value, $results);
}
}
La clé est que search_r
prend son quatrième paramètre par référence plutôt que par valeur ; l'esperluette &
est crucial.
Pour info : Si vous avez une ancienne version de PHP, vous devez spécifier la partie pass-by-reference dans le champ appelez à search_r
plutôt que dans sa déclaration. C'est-à-dire que la dernière ligne devient search_r($subarray, $key, $value, &$results)
.