PHP: получить значение массива как в Python? - PullRequest
14 голосов
/ 21 марта 2012

В Python я могу использовать метод «get» для получения значения из словаря без ошибок.

a = {1: "a", 2: "b"}
a[3] # error
a.get(3, "") # I got empty string.

Поэтому я ищу общую / базовую функцию, которая делает это:

function GetItem($Arr, $Key, $Default){
    $res = '';
    if (array_key_exists($Key, $Arr)) {
        $res = $Arr[$Key];
    } else {
        $res = $Default;
    }
    return $res;
}

Имеют ли в PHP те же функции, что и в Python?

спасибо: дд

Ответы [ 4 ]

10 голосов
/ 21 марта 2012

isset() обычно быстрее, чем array_key_exists(). Параметр $default инициализируется пустой строкой, если она опущена.

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

// Call as
$array = array("abc" => 123, "def" => 455);
echo getItem($array, "xyz", "not here");
// "not here"

Однако, если ключ массива существует, но имеет значение NULL, isset() не будет вести себя так, как вы ожидаете, поскольку он будет обрабатывать NULL так, как если бы он не существовал, и возвращал $default. Если вы ожидаете NULL s в массиве, вы должны использовать array_key_exists() вместо.

function getItem($array, $key, $default = "") {
  return array_key_exists($key, $array) ? $array[$key] : $default;
}
2 голосов
/ 21 марта 2012

Не совсем. Это должно вести себя так же.

function GetItem($Arr, $Key, $Default = ''){
    if (array_key_exists($Key, $Arr)) {
        $res = $Arr[$Key];
    } else {
        $res = $Default;
    }
    return $res;
}

Первая строка в вашей функции бесполезна, так как каждый путь кода приводит к перезаписи $res. Хитрость заключается в том, чтобы сделать параметр $Default необязательным, как указано выше.

Имейте в виду, что использование array_key_exists() может привести к значительному замедлению работы, особенно на больших массивах. Альтернатива:

function GetItem($Arr, $Key, $Default = '') {
  return isset($Arr[$Key]) ? $Arr[$Key] : $Default;
}
0 голосов
/ 21 марта 2012

Да. или

function GetItem($Arr, $Key, $Default) {
  return array_key_exists($Key, $Arr)
      ? $Arr[$Key]
      : $Default;
}
0 голосов
/ 21 марта 2012

В моей голове нет базовой функции для этого.

Ваш GetItem - хороший способ сделать то, что вы хотите:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...