for($i=0; isset($_POST['key_str'][$i]) != null; $i++)
{
// some php here
}
Я унаследовал некоторый устаревший код на работе, и я нашел выше цикл for () в нескольких местах. Я уже много лет пишу PHP, Javascript и Python и никогда не видел ничего подобного. Моя интуиция подсказывает мне, что это человек, который написал этот устаревший код, пришел с другого языка. И, возможно, был не очень опытным.
Вопросов:
1) isset($_POST['key_str'][$i]) работает лучше, чем count($_POST['key_str'])?
2) Похож ли это на синтаксис, который обычно встречается на другом языке? Если да, то на каком языке?
Я понимаю isset (). Что для меня не имеет смысла, так это то, почему он находится внутри цикла for ().
What doesn't make sense to me is why it is inside a for() loop. Добро пожаловать в чудесный мир Legacy Code! : D
Я разрабатываю на PHP более десяти лет и никогда не видел ничего подобного. Это заставляет меня съеживаться, но это работает, поэтому я оставляю это в покое. Нахожу такие странные вещи повсюду.
@d_bubb это хороший вопрос, и я понятия не имею .... :(
Я бы сделал изменение @b_dubb, просто чтобы избавить от головной боли следующего кодера, который столкнется с этим.
$_POST['key_str'][$i] может быть установлен, но это может быть строка, а не массив. Я бы заключил цикл for в условное выражение, которое проверяет правильный тип (массив) var и значение count ()> 0. Это выглядит крайне проблематично и хорошо ... неправильно.






Внутри isset в этом выражении используется $i (который увеличивается в цикле). $_POST['key_str'][$i], который входит в чек.
Таким образом, ожидается, что $_POST['key_str'] будет массивом, и этот цикл будет перебирать все элементы в этом массиве.
Если хотите, вы можете использовать count() или заменить все это циклом foreach, хотя это может привести к предупреждению, если $_POST['key_str'] вообще не установлен или не является массивом. isset - это очень простой способ обойти это, потому что он обрабатывает все эти ситуации и возвращает false, поэтому в этом сценарии цикл просто не будет введен.
это работает лучше, чем count ($ _ POST ['key_str'])?
Я не знаю о производительности (и я бы не стал беспокоиться об этом, если вы не ожидаете, что этот массив будет содержать тысячи элементов). Но я думаю, что есть небольшая мера предосторожности, потому что текущий цикл по-прежнему будет «работать», если эта переменная post не установлена или не является массивом, в то время как цикл foreach или использование count приведет к предупреждению.
foreach() намного быстрее, чем for(), и я сильно подозреваю, что for() намного быстрее, чем: доступ к индексу массива-> проверка, установлен ли он-> проверка того, что значение не равно нулю
Итак ... нет ... это не лучше, чем count($arr) > 0?
@GolezTrol "isset () - очень простой способ обойти это, потому что он обрабатывает все эти ситуации и возвращает false, поэтому цикл просто не будет введен в этом сценарии". На данный момент похоже, что при использовании этого метода производительность может снизиться, но это сэкономит пару строк кода / условия. Я за более эффективный код, так как в этом массиве могут быть тысячи варов.
Я бы предпочел быстро читать в любое время, кроме тех случаев, когда производительность действительно является ключевым фактором. Но я думаю, что isset работает довольно быстро, и чтобы сделать это по-другому, вам, возможно, придется выполнить несколько проверок. Если вы хотите быстрее, вам нужно будет проверить, получает ли массив и счет за пределами цикла. И даже тогда, что займет больше времени: отправка этих элементов с клиента на сервер или выполнение isset пару раз? Нужна ли оптимизация? Так или иначе, целью моего ответа было объяснить код и указать на возможные подводные камни при его изменении. Я не хотел защищать это как хорошее решение. :-)
isset () - это языковая конструкция, которая возвращает логическое значение, поэтому она никогда не может быть null. Однако сравнение использует оператор равный (==), а не оператор идентичный (===), таким образом, применяется жонглирование шрифтами:
Type of Operand 1 Type of Operand 2 Result
bool or null anything Convert both sides to bool
… И nullбросает в логическое значение false, поэтому:
true != null → true != false → true
false != null → false != false → false
Таким образом, цикл эквивалентен:
for($i=0; isset($_POST['key_str'][$i]); $i++){}
Другими словами, != null избыточен и ухудшает читаемость.
Теперь квадратные скобки используются для чтения элемента массива по ключу или строкового байта по смещению. Поскольку $_POST - внешняя переменная, цикл фактически может делать и то, и другое - я предполагаю, что первая была предназначена. Без дальнейшего контекста невозможно сказать, для чего он предназначен или как его переписать, но я подозреваю, что это запутанная альтернатива foreach().
Итак, чтобы ответить на ваши вопросы:
Это не имеет значения. Они делают совершенно разные вещи.
Это основано на мнении (для меня это синтаксис человека, не знакомого с программированием в целом).
С сайта php.net
Returns TRUE if var exists and has value other than NULL. FALSE otherwise.