Lorsqu’il s’agit d’aller chercher des données dans un tableau à plusieurs dimensions (un tableau dans un tableau, dans un tableau, etc.), il est facile d’utiliser la syntaxe: $data['key1']['key2']['key3']
Cependant si on tente d’accéder une clé qui n’existe pas, PHP génère une notice. Cet article apporte une solution élégante.
Exemple:
$data = [
'a' => ['aa' => 'aa_val', 'ab' => 'ab_val'],
'b' => ['ba' => 'ba_val', 'bb' => 'bb_val']
];
echo $data['b']['ba'];
// ba_val
echo $data['b']['MISSING_KEY'];
// PHP Notice: Undefined index: MISSING_KEY in test.php on line 8
La fonction array_fetch ci-dessous permet d’atteindre la valeur souhaitée presque de la même manière. Si l’une des clés manque, la valeur par défaut est renvoyée, ce qui permet de la tester et en tenir compte.
L’exemple ci-dessus devient, avec une syntaxe assez proche:
echo array_fetch($data, ['b', 'ba']);
// ba_val
Cette version ne génère pas de warning en cas de données manquantes dans le tableau renvoie par défaut null ou la valeur par défaut qu’on passe en paramètre:
echo array_fetch($data, ['b', 'MISSING KEY'], 'BIIP');
// BIIP
Voici la fonction array_fetch:
/**
* Fetch data in a multidimensional array using an array of keys.
* If a key is not found, the default value is returned.
*
* Example:
*
* $data = [
* 'a' => ['aa' => 'aa_val', 'ab' => 'ab_val'],
* 'b' => ['ba' => 'ba_val', 'bb' => 'bb_val']
* ];
* echo array_fetch($data, ['b', 'ba']);
* // ba_val
*
* @param array $search The array to search
* @param array $keys Array of keys to successively access in $search
* @param mixed $default Default value returned if data cannot be accessed with given keys
* @return void
*/
function array_fetch(array $search, array $keys, $default = null) {
$val = array_reduce($keys, function ($data, $key) {
return isset($data[$key]) ? $data[$key] : null;
}, $search);
return !is_null($val) ? $val : $default;
}