56 Stimmen

Standard-Array-Werte, wenn der Schlüssel nicht existiert?

Wenn ich ein Array voller Informationen habe, gibt es eine Möglichkeit, wie ich einen Standardwert zurückgeben kann, wenn der Schlüssel nicht existiert?

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

Und in meinem Code

$items = items();
echo $items['one']['a']; // 1

Aber kann ich einen Standardwert haben, der zurückgegeben wird, wenn ich einen Schlüssel eingebe, der nicht existiert, wie,

$items = items();
echo $items['four']['a']; // DOESN'T EXIST RETURN DEFAULT OF 99

87voto

Ich weiß, dass dies eine alte Frage ist, aber meine Google-Suche nach "php array default values" brachte mich hierher, und ich dachte, ich würde die Lösung posten, die ich suchte, sind die Chancen, es könnte jemand anderes helfen.

Ich wollte ein Array mit Standardoptionswerten, die durch benutzerdefinierte Werte überschrieben werden können. Ich verwendete schließlich 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);
?>

Ausgänge:

Array
(
    [color] => blue
    [size] => 5
    [text] => Custom text
)

83voto

Slavik Meltser Punkte 8270

Seit PHP 7 gibt es einen neuen Operator, der speziell für diese Fälle entwickelt wurde, genannt Null-Koaleszenz-Operator .

Das können Sie jetzt tun:

echo $items['four']['a'] ?? 99;

anstelle von

echo isset($items['four']['a']) ? $items['four']['a'] : 99;

Es gibt eine andere Möglichkeit, dies vor PHP 7 zu tun:

function get(&$value, $default = null)
{
    return isset($value) ? $value : $default;
}

Und das Folgende funktioniert ohne Probleme:

echo get($item['four']['a'], 99);
echo get($item['five'], ['a' => 1]);

Beachten Sie aber, dass der Aufruf einer Array-Eigenschaft auf einen Nicht-Array-Wert einen Fehler auslöst. Z.B..

echo get($item['one']['a']['b'], 99);
// Throws: PHP warning:  Cannot use a scalar value as an array on line 1

Außerdem gibt es einen Fall, in dem ein fataler Fehler ausgelöst wird:

$a = "a";
echo get($a[0], "b");
// Throws: PHP Fatal error:  Only variables can be passed by reference

Zum Schluss gibt es einen hässlichen Workaround, der aber fast gut funktioniert (Probleme in einigen Fällen wie unten beschrieben):

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

21voto

Mārtiņš Briedis Punkte 16925

Damit sollte es klappen:

$value =  isset($items['four']['a']) ? $items['four']['a'] : 99;

Eine Hilfsfunktion wäre nützlich, wenn Sie diese häufig schreiben müssen:

function arr_get($array, $key, $default = null){
    return isset($array[$key]) ? $array[$key] : $default;
}

9voto

Eric Keyte Punkte 633

Ab PHP7.0 können Sie den Null-Koaleszenz-Operator verwenden ??

$value = $items['one']['two'] ?? 'defaut';

Für <5,6

Sie könnten auch dies tun:

$value =  $items['four']['a'] ?: 99;

Dies entspricht:

$value =  $items['four']['a'] ? $items['four']['a'] : 99;

Das spart die Notwendigkeit, die gesamte Anweisung in eine Funktion zu packen!

Beachten Sie, dass dies nur dann nicht 99 zurückgibt, wenn der Schlüssel 'a' ist nicht gesetzt in items['four'] . Stattdessen wird 99 zurückgegeben, wenn und nur wenn der Wert $items['four']['a'] falsch ist (entweder nicht gesetzt oder ein falscher Wert wie 0).

4voto

Gerfried Punkte 6956

Die Frage ist sehr alt, aber vielleicht ist meine Lösung noch hilfreich. Für Projekte, bei denen ich "if array_key_exists" sehr oft benötige, wie z.B. Json-Parsing, habe ich die folgende Funktion entwickelt:

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

Sie können das Array dann einfach "abfragen" wie:

$res = getArrayVal($myArray,'companies/128/address/street');

Dies ist einfacher zu lesen als die entsprechende altmodische Methode...

$res = (isset($myArray['companies'][128]['address']['street']) ? $myArray['companies'][128]['address']['street'] : null);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X