Catégories
PHP Programmation

Aller chercher des données dans un tableau multidimensionnel en PHP

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;
}