#php
#php
Вопрос:
Есть ли какой-либо способ проверить, не является ли переменная not null, а затем проверить, имеет ли переменная вложенные ключи ассоциативного массива, используя сокращение? Что-то вроде необязательной цепочки для ассоциативных массивов?
Пример того, что я хотел бы сделать кратким:
public $arr;
//$arr gets set as an associative array somewhere else in the code.
function someFunc() {
if ($this->arr amp;amp; $this->arr['key1'] amp;amp; $this->arr['key1']['key2'] == 'Some Value') { // shorten this line?
// Do Something Cool!
}
}
Я ищу что-то похожее на необязательную цепочку в Javascript, например :
if (obj.key1?.key2 == 'Some Value') {
// Do something kool
}
Существует высокая вероятность того, что это дубликат, и я заранее приношу извинения, если это так. Я попытался найти это для ассоциативных массивов и не смог найти ничего конкретного.
Комментарии:
1. В PHP / 8 он используется для объектов, но не для массивов.
2. Хотя это условие может быть уменьшено до
isset($array['key1']['key2']) amp;amp; $array['key1']['key2'] === 'Some value'
.3. просто используйте
isset
4. Я знаю
isset
, что искал что-то более короткое, как упоминалось выше.5. зачем вам что-то более короткое? какую проблему вы пытаетесь решить, сократив ее еще больше
isset
?
Ответ №1:
Вы могли бы сохранить оператор if без изменений, но заменить $this->arr amp;amp; $this->arr['key1']
на оператор объединения Null ( ??
), поэтому, если они не определены, он будет использовать запасной вариант, который не равен тестовой строке:
if (($this->arr['key1']['key2'] ?? false) == 'Some Value') {
// Do Something Cool!
}
Итак, если $this->arr['key1']['key2']
определено, вы сравните это с Some Value
, в противном случае, если оно не определено, вы сравните (например) false
с Some Value
witch останется false
.
Комментарии:
1. Я часто обнаруживал, что этот оператор объединения null сложнее читать
Ответ №2:
Используйте функцию php isset
: https://www.php.net/manual/en/function.isset.php
Он будет проверять наличие нескольких ключей: if( isset($this->arr['key1']['key2'] ) {...}
а также включает проверку null.
Если вам по какой-то причине нужно сократить его еще больше, просто разложите его на другую функцию:
public $arr;
//$arr gets set as an associative array somewhere else in the code.
function someFunc()
{
if ($this->checkForSomeValue($this->arr, 'Some Value', 'key1', 'key2')) { // shorten this line?
// Do Something Cool!
}
}
function checkForSomeValue(array $arr, string $valueToCheck, ...$keys)
{
$valueCompare = $arr;
foreach($keys as $key)
{
if(!isset($valueCompare[$key]))
{
$valueCompare = null;
break;
}
else
{
$valueCompare = $valueCompare[$key];
}
}
return $valueCompare amp;amp; $valueCompare === $valueToCheck;
}
Я обновил ответ, чтобы разрешить предоставление ключей
Комментарии:
1. Спасибо — я думаю, что создание пользовательской функции просто имеет больше смысла. Возможно ли, чтобы функция работала с различными «ключевыми» параметрами и на разной глубине вложенности?
2. @Coola это становится сложнее, дайте мне посмотреть…. вы могли бы рассмотреть возможность использования аргументов переменной длины:
function(...$keys) {...}
, но для постоянной проверки глубины потребуется некоторый цикл$arr
3. Спасибо, Джеймс. Если вы можете что-то придумать, пожалуйста, обновите ответ. Надеюсь, теперь вы понимаете мою склонность к более простому необязательному объединению в цепочки, поскольку было бы намного проще писать и читать встроенное то, что происходит в коде.
4. @Coola я обновил ответ. теперь вы можете предоставить
checkForSomeValue
функции несколько ключей. я думаю, что логика немного сложна для чтения. может быть улучшено для улучшения способности поддерживать5. Разве функция не должна быть рекурсивной для вложенных ключей?