Intereting Posts

Объединение массивов в PHP

Попытка изучить массивы в PHP. Фрагменты размещены для краткости.

HTML-форма здесь:

<p>What are your favorite type of cookies?</p> <input type="checkbox" name="cookies[]" value="Oreos" />Oreos<br /> <input type="checkbox" name="cookies[]" value="Chocolate chip" />Chocolate chip<br /> <input type="checkbox" name="cookies[]" value="Sugar" />Sugar<br /> <input type="checkbox" name="cookies[]" value="Vanilla Mocha" />Vanilla Mocha<br /> <p>What are your favorite type of drinks?</p> <input type="checkbox" name="drinks[]" value="Soda" />Soda<br /> <input type="checkbox" name="drinks[]" value="Wine" />Wine<br /> <input type="checkbox" name="drinks[]" value="Milk" />Milk<br /> <input type="checkbox" name="drinks[]" value="Water" />Water<br /> 

PHP-страница здесь:

 foreach ($drinks as $d) { echo "Your favorite drink(s) are: " . $d . "<br />"; } foreach ($cookies as $cookie) { echo "Your favorite cookies are: " . $cookie . "<br />"; } $experimentalArray = array($cookie => $d); foreach ($experimentalArray as $key => $value) { echo "Cookie - " . $key . " Drink - " . $value . "<br /><br />"; } 

Куки и напитки – это вопросы с несколькими вариантами выбора, поэтому вы можете выбрать более одного ответа.

Однако экспериментальный массив отображает только последний ответ, выбранный как в случае с напитком, так и в файле cookie.

Например, я выбираю Oreos и Chocolate Chip в печенье, а также соду и вино в напитках.

Ответ звучит так: «Cookie – Chocolate chip Drink – Wine»

Почему он не отображает все значения?

Отредактировано для многомерного скрипта

 <?php $drinks = $_POST['drinks']; $cookies = $_POST['cookies']; $combinedArray = array( 'Cookies' => $cookies, 'Drinks' => $drinks); foreach($combinedArray as $snackType => $snack) { print "<h2>$snackType</h2>"; foreach ($snack as $number => $snackChosen) { print " $number is $snackChosen<br />"; } 

}?>

Итак, попробовал сделать многомерный скрипт массива, так как предыдущий скрипт не собирался получать все значения в соответствии с формой HTML.

Этот скрипт работает (был сорван из книги и изменен для этого кода здесь), однако значение $ number начинается с 0. Как мне изменить это так, чтобы оно начиналось с 1 вместо?

Кроме того, это правильная форма для многомерного массива? Может быть, она была переписана лучше?

И еще раз спасибо за все ответы. Даже если я не совсем понимаю их! 🙂 Итак, благодарю вас за ваше терпение.

Не знаю, какой учебник php вы используете, но перестаете его использовать, это, вероятно, ужасно устарело!

Вам нужно будет использовать $_POST / $_GET / $_REQUEST (содержит POST, GET и – в зависимости от настроек config – Cookie). register_globals устарел и потенциальное отверстие безопасности, если включено.

Например, используйте $drinks = isset($_POST['drinks']) ? $_POST['drinks'] : array(); $drinks = isset($_POST['drinks']) ? $_POST['drinks'] : array(); чтобы получить ваш $ drink массив. То же самое для $ cookie.


О проблеме с массивом. Похоже, вам нужны ключи из массива напитков и значения из массива файлов hte. Если да, посмотрите на array_combine () . Обратите внимание, что для обоих массивов требуется одинаковое количество элементов, хотя и подача их с помощью созданных пользователем массивов, где длина может меняться, не очень хорошая идея.

Fyi, $experimentalArray = array($cookie => $d); отображает последний элемент из $ cookies в последний элемент $ drinks, потому что PHP не имеет области блока, и поэтому $ cookie и $ d все еще указывают на последние элементы массива, которые вы получили в ваших циклах foreach.

Здесь есть несколько проблем.

  1. Когда вы выполняете итерацию с помощью foreach, и вы хотите выполнять действия для каждого элемента, код должен находиться между командами foreach.
  2. Всегда есть шанс, что пользователь выберет другое количество файлов cookie, чем напитки, что вызовет проблемы, потому что у одного товара не будет пары.

Решением, которое я предлагаю, является функция array_combine() для сопряжения файлов cookie с напитками после заполнения каждой из массивов той же длины:

 <?php //$cookies = array_pad( $cookies , count( $drinks ), '(none)' ); Doesn't work, thanks for pointing this out @Phoenix $drinks = array_pad( $drinks, count( $cookies ), '(none)' ); //If more cookies than drinks, add (none) drinks to account for extra cookies $combined = array_combine( $cookies, $drinks ); //Combine arrays and cookies ?> 

Конечно, это может показаться немного сложным, поэтому позвольте мне объяснить. Скажем, пользователь выбирает сахарные и шоколадные чипсы с молоком и водой. Это, очевидно, не самый вкусный выбор, но они являются наиболее оптимальными в этом случае. Поскольку существует одинаковое количество файлов cookie, так как есть напитки, PHP просто сопоставляет выбор с помощью функции array_combine() . Эта функция принимает массив ключей (cookie) и значений ($ drinks) и объединяет их в один. Ex.

 array_combine( array( 'one', 'two' ), array( 1, 2 ) ) == array( 'one' => 1, 'two' => 2 ); 

У нас возникают проблемы, когда пользователь выбирает неравное количество любимых закусок. Это когда первые две линии вступают в игру. Первая строка добавит (нет) в массив файлов cookie для каждого дополнительного напитка. Ex.

 array_pad( array( 'one' ), 2, '(none)' ) == array( 'one', '(none)' ); 

Следующая строка делает то же самое, но вместо этого равна напиткам с печеньем (в случае, если выбрано больше печений, чем напитков).

Дайте мне знать, если вам нужно больше примеров.

Как насчет двух предыдущих? Работают ли они надлежащим образом? Я считаю, что проблема здесь:

 $experimentalArray = array($cookie => $d); 

Что должно быть

 $experimentalArray = array($cookies => $drinks); 

Я не думаю, что когда-либо делал массив таким образом, хотя, не уверен, что значения $ cookie автоматически станут ключами от $ drinks.

Если нет, метод генерации такого массива будет выглядеть примерно так:

 if(count($drinks) >= count($cookies)) { $count = count($drinks); } else { $count = count($cookies); } for($i=1;$i<=$count;$i++) { if(isset($drinks[$i]) && isset($cookies[$i])) { $experimentalArray[$cookies[$i]] = $drinks[$i]; } else if(isset($drinks[$i]) && !isset($cookies[$i])) { $experimentalArray['None' . $i] = $drinks[$i]; } else { $experimentalArray[$cookies[$i]] = 'None' . $i; } } 

Или что-то в этом роде, которое учитывается, если меньше одного выбранного типа, чем другого.

 This script works (was ripped off from a book and modified for this code here), however, $number value starts at 0. How do I modify that so that it starts at 1 instead? 

PHP всегда запускает Count в 0. Вы можете узнать больше об этом по адресу: http://php.net/manual/de/language.types.array.php