#php
#php
Вопрос:
Я опубликовал еще один вопрос по аналогичной теме, но подумал, что для этого нужен новый вопрос. У меня есть ассоциативный массив с именем cars, который перебирается для получения строки.
Часть, которую я не понимаю, заключается в том, как работает цикл с использованием $i в качестве ключа в операторе if, когда массив является ассоциативным массивом, а ключ — строкой. Если оператор if говорит, что $i — это cars[0], cars[1], cars [2], то как он выполняет цикл, когда ключи на самом деле являются строками, такими как cars [BMW], cars [Mercedes] или cars [AUDI]?
Мне сказали, что это потому, что PHP слабо типизирован, но это все равно не имеет смысла.
Пожалуйста, объясните, что происходит.
if(!isset($_POST["cars"])){
$carsErr ="Cars must not be left empty";
$invalidData = true;
} else {
$cars = array("BMW"=>0,"Mercedes"=>0,"AUDI" =>0,"Trabant"=>0);
if ($cars == "") {
$carsErr ="Cars must not be left empty";
$invalidData = true;
} else {
$selectedCars = "";
for($i=0; $i < count($cars); $i )
{
if(isset($_POST["cars"][$i])) {
$cars[$_POST["cars"][$i]] = 1;
//concatenate all cars in the one string.
$theCars = strtoupper ($_POST["cars"][$i]);
switch ($theCars)
{
case "BMW":
$selectedCars .= "BMW, ";
break;
case "MERCEDES":
$selectedCars .= "Mercedes, ";
break;
case "AUDI":
$selectedCars .= "Audi, ";
break;
case "TRABANT":
$selectedCars .= "Trabant, ";
break;
default:
$selectedCars .= $_POST["cars"][$i].", ";
}
}
}
}
}
Комментарии:
1. Разве он не использует
$i
$_POST["cars"]
значения ($_POST["cars"][$i]
)?2.
$_POST["cars"]
Ключи взяты из ассоциативного arrray, а ключи представляют собой строки. Все значения равны нулю после их установки функцией array. Насколько я понимаю.3. вы подсчитываете свой массив $cars и выполняете цикл, пока $i(0) < count($cars) затем $i , внутри цикла вы используете $i, чтобы проверить, установлен ли $ _POST[‘cars’][$i] (например, $ _POST[‘cars’] [2] = ‘BMW’ ). Если установлено значение 1, равное $cars[‘BMW’] . Затем strtoupper($ _POST[«cars»][$i]), если значение $ _POST [«cars»] [2] равно «bmw», оно становится «BMW», а затем переключается. Вот и все …
4. как указал @NigelRen, $ i используется в $ _POST [«cars»], а не в $cars
5. Рассмотрим следующий код:
$_POST["cars"] = ["BMW", "VW", "Honda"]
.cars
Индекс$_POST
массива хранит другой массив. Итак, вызывая$_POST["cars"][0]
, вы сначала получаете доступ кcars
индексу$_POST
, а затем к индексу0
$_POST["cars"]
. Это называется вложенным массивом или многомерным массивом.
Ответ №1:
Здесь идет то, что я узнал со времени моего первоначального сообщения.
Массив $ _POST [cars] будет выглядеть примерно так:
$_POST[cars] = array (
[0] => BMW,
[1] => Mercedes,
[2] => Audi,
[3] => Trabant
);
И массив $cars будет выглядеть следующим образом:
$cars = array (
BMW => 0,
Mercedes => 0,
Audi => 0,
Trabant => 0
);
Таким образом, он индексирует через $_POST[cars]
массив, используя [0],[1],[2]
etc. с помощью $i в цикле for .
Затем он попадает туда $cars[$_POST["cars"][$i]] = 1;
, где он ссылается на 0
массив $cars для каждого элемента в $_POST
массиве, используя синтаксис многомерного массива. Это то, чего я раньше не получал.
он использует isset
функцию для проверки, установлена ли каждая из переменных массива post в форме. Затем он устанавливает для каждого значение 1
или оставляет его как 0
использующее $cars[$_POST["cars"][$i]] = 1;
присваивание.
Кажется, что все еще не хватает одной вещи, и это то, что isset
использует функция. Я предполагаю, что это 0
или null
или 1
, если установлен флажок. Но это должно быть не частью POST
массива, а отдельным элементом в самом POST
массиве.