Попытка изучить массивы в 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.
Здесь есть несколько проблем.
Решением, которое я предлагаю, является функция 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