Si j'ai un tableau plein d'informations, y a-t-il un moyen de changer les valeurs par défaut si la clé n'existe pas?
function items() {
return array(
'one' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
'two' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
'three' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
);
}
Et dans mon code
$items = items();
echo $items['one']['a']; // 1
Mais puis-je avoir une valeur par défaut à renvoyer si je donne une clé qui n'existe pas comme,
$items = items();
echo $items['four']['a']; // DOESN'T EXIST RETURN DEFAULT OF 99
Je sais que c’est une vieille question, mais ma recherche sur Google concernant les "valeurs par défaut des tableaux php" m m’a amenée ici et je pensais publier la solution que je cherchais. Il est probable que cela pourrait aider quelqu'un d'autre.
Je voulais un tableau avec des valeurs d'option par défaut pouvant être remplacées par des valeurs personnalisées. J'ai fini par utiliser array_merge .
Exemple:
<?php
$defaultOptions = array("color" => "red", "size" => 5, "text" => "Default text");
$customOptions = array("color" => "blue", "text" => "Custom text");
$options = array_merge($defaultOptions, $customOptions);
print_r($options);
?>
Les sorties:
Array
(
[color] => blue
[size] => 5
[text] => Custom text
)
Depuis PHP 7, il existe un nouvel opérateur spécialement conçu pour ces cas, appelé Null Coalesce Operator .
Alors maintenant, vous pouvez faire:
echo $items['four']['a'] ?? 99;
au lieu de
echo isset($items['four']['a']) ? $items['four']['a'] : 99;
Il y a une autre façon de faire cela avant le PHP 7:
function get(&$value, $default = null)
{
return isset($value) ? $value : $default;
}
Et ce qui suit fonctionnera sans problème:
echo get($item['four']['a'], 99);
echo get($item['five'], ['a' => 1]);
Mais notez que l'utilisation de cette manière, l'appel d'une propriété de tableau sur une valeur autre que celle-ci générera une erreur. Par exemple.
echo get($item['one']['a']['b'], 99);
// Throws: PHP warning: Cannot use a scalar value as an array on line 1
De plus, il y a un cas où une erreur fatale sera renvoyée:
$a = "a";
echo get($a[0], "b");
// Throws: PHP Fatal error: Only variables can be passed by reference
Au final, il existe une solution de contournement laide, mais qui fonctionne presque bien (problèmes dans certains cas décrits ci-dessous):
function get($value, $default = null)
{
return isset($value) ? $value : $default;
}
$a = [
'a' => 'b',
'b' => 2
];
echo get(@$a['a'], 'c'); // prints 'c' -- OK
echo get(@$a['c'], 'd'); // prints 'd' -- OK
echo get(@$a['a'][0], 'c'); // prints 'b' -- OK (but also maybe wrong - it depends)
echo get(@$a['a'][1], 'c'); // prints NULL -- NOT OK
echo get(@$a['a']['f'], 'c'); // prints 'b' -- NOT OK
echo get(@$a['c'], 'd'); // prints 'd' -- OK
echo get(@$a['c']['a'], 'd'); // prints 'd' -- OK
echo get(@$a['b'][0], 'c'); // prints 'c' -- OK
echo get(@$a['b']['f'], 'c'); // prints 'c' -- OK
echo get(@$b, 'c'); // prints 'c' -- OK
Cela devrait faire l'affaire:
$value = isset($items['four']['a']) ? $items['four']['a'] : 99;
Une fonction d’aide serait utile si vous deviez écrire beaucoup:
function arr_get($array, $key, $default = null){
return isset($array[$key]) ? $array[$key] : $default;
}
Vous pouvez aussi faire ceci:
$value = $items['four']['a'] ?: 99;
Cela équivaut à:
$value = $items['four']['a'] ? $items['four']['a'] : 99;
Cela évite d'avoir à emballer toute la déclaration dans une fonction!
Notez que cela ne renvoie pas 99 si et seulement si la clé 'a'
n'est pas définie dans items['four']
. Au lieu de cela, il renvoie 99 si et seulement si la valeur $items['four']['a']
est false (non définie ou une valeur fausse telle que 0).
Pas que je sache de.
Vous devez vérifier séparément avec isset
echo isset($items['four']['a']) ? $items['four']['a'] : 99;
Utilisez la fonction Array_Fill ()
http://php.net/manual/en/function.array-fill.php
$default = array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
);
$arr = Array_Fill(1,3,$default);
print_r($arr);
Voici le résultat:
Array
(
[1] => Array
(
[a] => 1
[b] => 2
[c] => 3
[d] => 4
)
[2] => Array
(
[a] => 1
[b] => 2
[c] => 3
[d] => 4
)
[3] => Array
(
[a] => 1
[b] => 2
[c] => 3
[d] => 4
)
)
La question est très ancienne, mais peut-être que ma solution est toujours utile. Pour les projets pour lesquels j'ai besoin très souvent de "if array_key_exists", telle que l'analyse Json, j'ai développé la fonction suivante:
function getArrayVal($arr, $path=null, $default=null) {
if(is_null($path)) return $arr;
$t=&$arr;
foreach(explode('/', trim($path,'/')) As $p) {
if(!array_key_exists($p,$t)) return $default;
$t=&$t[$p];
}
return $t;
}
Vous pouvez alors simplement "interroger" le tableau comme ceci:
$res = getArrayVal($myArray,'companies/128/address/street');
C’est plus facile à lire que l’équivalent démodé ...
$res = (isset($myArray['companies'][128]['address']['street']) ? $myArray['companies'][128]['address']['street'] : null);
Je ne sais pas comment faire exactement avec le code que vous avez fourni, mais vous pouvez le contourner avec une fonction qui accepte un nombre quelconque d'arguments et renvoie le paramètre que vous recherchez ou le paramètre par défaut.
Usage:
echo arr_value($items, 'four', 'a');
ou:
echo arr_value($items, 'four', 'a', '1', '5');
Une fonction:
function arr_value($arr, $dimension1, $dimension2, ...)
{
$default_value = 99;
if (func_num_args() > 1)
{
$output = $arr;
$args = func_gets_args();
for($i = 1; $i < func_num_args(); $i++)
{
$outout = isset($output[$args[$i]]) ? $output[$args[$i]] : $default_value;
}
}
else
{
return $default_value;
}
return $output;
}
Vous pouvez utiliser DefaultArray from Bibliothèque PHP non standard . Vous pouvez créer un nouveau DefaultArray à partir de vos éléments:
use function \nspl\ds\defaultarray;
$items = defaultarray(function() { return defaultarray(99); }, $items);
Ou renvoyez DefaultArray à partir de la fonction items()
:
function items() {
return defaultarray(function() { return defaultarray(99); }, array(
'one' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
'two' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
'three' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
));
}
Notez que nous créons un tableau imbriqué par défaut avec une fonction anonyme function() { return defaultarray(99); }
. Sinon, la même instance d'objet de tableau par défaut sera partagée par tous les champs de tableau parent.