Сокращение для проверки, не является ли ассоциативный массив null и существует ли ключ

#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. Разве функция не должна быть рекурсивной для вложенных ключей?