Значения массива по умолчанию, если ключ не существует? - PullRequest
40 голосов
/ 04 марта 2012

Если у меня есть массив, полный информации, могу ли я по умолчанию использовать значения, которые будут возвращены, если ключ не существует?

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

И в моем коде

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

Но можно ли вернуть значение по умолчанию, если я дам ключ, который не существует, например,

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

Ответы [ 10 ]

68 голосов
/ 03 июля 2013

Я знаю, что это старый вопрос, но мой поиск в Google по "значениям по умолчанию для массива php" привел меня сюда, и я подумал, что опубликую решение, которое ищу, возможно, оно поможет кому-то другому.

Мне нужен массив со значениями параметров по умолчанию, которые могут быть переопределены пользовательскими значениями. Я закончил с использованием array_merge .

Пример:

<?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);
?>

Выходы:

Array
(
    [color] => blue
    [size] => 5
    [text] => Custom text
)
54 голосов
/ 29 октября 2016

Начиная с PHP 7, для этих случаев специально разработан новый оператор, который называется Null Coalesce Operator .

Так что теперь вы можете делать:* вместо

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

Существует еще один способ сделать это до PHP 7:

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

И следующее будет работать без проблем:

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

Но учтите, что при использовании этого способа вызов свойства массива для значения, не являющегося массивом, приведет к ошибке.Например,

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

Кроме того, есть случай, когда будет выдана фатальная ошибка:

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

В конечном итоге, существует ужасный обходной путь, но он работает почти хорошо (проблемы вслучаи, как описано ниже):

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
19 голосов
/ 04 марта 2012

Это должно сработать:

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

Вспомогательная функция будет полезна, если вам придется много писать:

function arr_get($array, $key, $default = null){
    return isset($array[$key]) ? $array[$key] : $default;
}
4 голосов
/ 28 февраля 2014

Вы также можете сделать это:

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

Это соответствует:

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

Это избавляет от необходимости заключать весь оператор в функцию!

Обратите внимание, что это не возвращает 99 тогда и только тогда, когда ключ 'a' не установлен в items['four']. Вместо этого он возвращает 99 тогда и только тогда, когда значение $items['four']['a'] равно false (либо не установлено, либо равно false, например 0).

3 голосов
/ 04 марта 2012

Не знаю, что я знаю.

Вам придется проверить отдельно с isset

echo isset($items['four']['a']) ? $items['four']['a'] : 99;
2 голосов
/ 21 января 2016

Вопрос очень старый, но, возможно, мое решение все еще полезно.Для проектов, где мне очень часто нужно «if array_key_exists», таких как анализ Json, я разработал следующую функцию:

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

Затем вы можете просто «запросить» массив, например:

Это легче читать, чем аналогичный старомодный способ ...

$res = (isset($myArray['companies'][128]['address']['street']) ? $myArray['companies'][128]['address']['street'] : null);
2 голосов
/ 24 января 2015

Используйте функцию 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);

Это результат:

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
        )

)
0 голосов
/ 13 декабря 2016

В PHP7, как упоминал Славик, вы можете использовать оператор объединения нулей: ??

Ссылка на PHP документы .

0 голосов
/ 19 декабря 2015

Вы можете использовать DefaultArray из Нестандартная библиотека PHP .Вы можете создать новый DefaultArray из ваших элементов:

use function \nspl\ds\defaultarray;
$items = defaultarray(function() { return defaultarray(99); }, $items);

или вернуть DefaultArray из функции 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,
         ),
    ));
}

Обратите внимание, что мы создаем вложенный массив по умолчанию с анонимной функцией function() { return defaultarray(99); }.В противном случае один и тот же экземпляр объекта массива по умолчанию будет общим для всех полей родительского массива.

0 голосов
/ 04 марта 2012

Я не знаю способа сделать это точно с предоставленным вами кодом, но вы можете обойти это с помощью функции, которая принимает любое количество аргументов и возвращает искомый параметр или значение по умолчанию.

Использование:

echo arr_value($items, 'four', 'a');

или

echo arr_value($items, 'four', 'a', '1', '5');

Функция:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...