Цикл PHP с использованием INT и строк — как это работает?

#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 массиве.