Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: foreach() два ключа и два значения?
 
 автор: sasha12342   (11.04.2013 в 20:06)   письмо автору
 
 

Здравствуйте!
Есть такой код:
foreach($_REQUEST as $key => $value)
        $x1 = $key;
        $x2 = $value;

Массив "$_REQUEST " содержит пару "имя\значение" но появилось необходимость передать через этот массив ещё одно значение (можно и пару "имя\значение"). Но как я понял конструкция "foreach" не передаёт две пары и два значения... или передаёт?

  Ответить  
 
 автор: confirm   (11.04.2013 в 21:06)   письмо автору
 
   для: sasha12342   (11.04.2013 в 20:06)
 

Прочтите сперва что это за массив.

  Ответить  
 
 автор: sasha12342   (11.04.2013 в 21:26)   письмо автору
 
   для: confirm   (11.04.2013 в 21:06)
 

Ассоциативный массив (array), который по умолчанию содержит данные переменных $_GET, $_POST и $_COOKIE.
И что?
На странице могут быть сколь-угодно полей "input" с уникальными именами и значениями которые вводиться пользователями. К каждому имени со значением необходимо добавить второе значение. После чего вытаскиваем из массива имя\значение1\значение2 и обрабатываем их.

Может есть другой способ реализовать задуманное но я его не знаю, может кто подскажет...

  Ответить  
 
 автор: confirm   (11.04.2013 в 21:37)   письмо автору
 
   для: sasha12342   (11.04.2013 в 21:26)
 

А ничего. Если не поняли, то выведите содержимое этого массива, может тогда поймете.

А в описании на замечание обратите внимание.

Сколько угодно полей, и всю эту кучу у вас один супер скрипт обрабатывает, что возникла такая необходимость в этом массиве? Уж наверное практически на все есть свои обработчики, и если вы их сами пишите, сами готовите ссылки/формы, то уж точно знаете каким методом передаются они. Следовательно в $_REQUEST необходимости большой нет, а нужны: $_GET, $_POST....

  Ответить  
 
 автор: sasha12342   (11.04.2013 в 22:23)   письмо автору
 
   для: confirm   (11.04.2013 в 21:37)
 

Содержимое этого массива выдаёт все значения "имён-значений" которые находятся в этом документе.
Я не знаю какие именно "имена" и значения будут в этом документе ибо их, туда заносят сами пользователи. Если все имена мне известны (несколько тысяч) то значения могут быть любые.

Я использую массив "$_REQUEST" потому что пользователь может в любое время изменить 10 значений или 100 или 1000 и нажать на кнопку "изменить". После чего я вытаскиваю все имена (которые начинаются с определённого символа) и их значения и обрабатываю полученные данные (по одному). Так вот сейчас появилась необходимость передавать не одно значения для одного имени а два значения для одного имени (вытащить из массива: "имя-значение1-значение2") и обрабатывать их.

Как прикрутить сюда $_POST я не представляю.

  Ответить  
 
 автор: confirm   (11.04.2013 в 22:45)   письмо автору
 
   для: sasha12342   (11.04.2013 в 22:23)
 

Если пользователь изменяет имена, и вы этими именами оперируете, то это крах....

Что за имена, для чего? Почему их пользователи изменяют? В чем они их в любое время (уже вопрос) изменяют?

  Ответить  
 
 автор: sasha12342   (11.04.2013 в 23:13)   письмо автору
 
   для: confirm   (11.04.2013 в 22:45)
 

Пользователи имена не меняют, они их выбирают.

В базе около 3000 позиций с разными именами, пользователь может выбрать хоть все эти позиций, а на экран они выводиться циклом и т.д. и т.п.

Но суть не в этом, меня интересует как отправить через массив имя+два значения а не имя=>значение.

Из массива вытаскиваю такие записи:
Q1091 : 5

W2091 : 10_20

Q1092 : 2

W2092 :

Q1093 : 5

W2093 : 20_30 
таким образом:
foreach($_REQUEST as $key => $value) 
     {
    $x1 = $key;
    $x2 = $value;
           }

Массив выдаёт 6 циклов а мне нужно только три: имена которые начинаются с буквы "Q" со значениями: 5 и 10_20 хотя значение "10_20" относится к имени "W2091" как вытащить одним циклом два имени с двумя значениями или одно имя "Q1091" с двумя значениями 5 и 10_20

Это вообще возможно? Если да то как?

  Ответить  
 
 автор: confirm   (12.04.2013 в 01:40)   письмо автору
 
   для: sasha12342   (11.04.2013 в 23:13)
 

Я вроде бы как на русском спросил - из чего пользователи все это присылают:
а) из формы?
б) шлют СМС?
в) пишут письма ручкой?
На это вы можете ответить, чтобы понять чего вы уперлись в этот $_REQUEST?

Если вам нужно только на Q:
а) если ненужные значения (на W) это следствие выборки из базы, то не выбирайте их
б) если выбирать из базы нужно все, а из массива получить только на Q, то в чем смысл?

Имя (ключ) не могут иметь два значения, понимаете - никак! Указать ключу два значения, это склеить их в строку, а затем разделить. Но лучше поместить эти значения в массив для ключа.

  Ответить  
 
 автор: sasha12342   (12.04.2013 в 18:20)   письмо автору
 
   для: confirm   (12.04.2013 в 01:40)
 

Из формы получаю данные.
"W" это не выборка из БД а имя дополнительного поля которое должно-было передать третье значение (это скорей неудачный эксперимент с передачей двух значений для одного цикла).
"Q" имя "input-а" которое вытаскивается из базы + "value" со значением которую вводят пользователи.

Пользователь вытаскивает на страницу, скажем 100 записей из базы, после чего вносит изменения в 50 из них и нажимает кнопку "изменить"
Я с удовольствием-бы занёс всё это в массив, передал, и вытащил-бы из массива все нужные данные, но я не знаю как это сделать. Вот я и упёрся "в этот $_REQUEST" потому что он содержит в себе все пары "имя=>значение" которые есть в документе.

А задачу эту я решил путём склеивания:
name='$id&$znach2'

После чего нарезаю по знаку "&" на две переменные:
 $arr = explode("&",$key);
$key2 = $arr[0];
$rezult = $arr[1];


Но лучше поместить эти значения в массив для ключа

Подскажите пожалуйста как это сделать? (занести в массив и вытащить из него имя+два значения)
Спасибо.

  Ответить  
 
 автор: confirm   (12.04.2013 в 19:08)   письмо автору
 
   для: sasha12342   (12.04.2013 в 18:20)
 

Не знаю как вы читаете, но вы так и не понимаете, что же такое $_REQUEST. Он вам совсем не нужен, и использовать его надо тогда, когда в нем действительно есть необходимость.

Если вы уперлись в $_REQUEST, значит вы не имеете понятия, что форма может быть отправлена двумя методами: GET (по умолчанию) и POST (если указать этот метод отправки в атрибуте method формы).

Кто выдает пользователю форму? Если вы, то неужели вы не можете указать и не знаете каким методом будет отправлена форма? А если знаете, то почему не используете соответствующий массив - $_GET или $_POST?

Если форма передается методом POST, и ее атрибут action содержит не только путь и имя скрипта обработчика формы, но и GET параметры, то на сервер можно передать как и GET, так и POST данные. При этом, имена ключей обоих данных могут совпадать. Но если искать эти данные в массиве $_REQUEST, то в зависимости от установки variables_order пропадут или GET, или POST.

Имена полей формы указывает не пользователь а вы, так что никаких имен input'ов из базы просто быть не может. Имя поля, это ключ массива полученный на сервере.

Записи в базе удобно держать под уникальными идентификаторами, а не по Q или W, или еще чего либо. Если у вас таковые записи, значит именуйте поля формы одним именем организуя массив полей, первичным ключом которых будет идентификатор записи, а вторичный будет содержать номера (индексы) параметров которые нужно редактировать. Сколько параметров для редактирования, столько и элементов в форме под одним ключом идентификатора.

Здесь пример, в котором из базы выбраны две записи с id 1 и 2. У каждой из этих записей из трех их полей выбраны значения для редактирования. Вторичный ключ в примере не индексный (var[1][]), а содержит имя редактируемого значения. Выглядит это так:
<?
echo '<pre>';
print_r($_POST);
//нам нужны только поля с именем var
//получаем массив с ключами равными id
//и вложенными массивами с редактируемыми данными
print_r($_POST['var'])
?>
<form method="post">
<input name="var[1][name1]" value="1" />
<input name="var[1][name2]" value="1" />
<input name="var[1][name3]" value="1" /><br />
<input name="var[2][name1]" value="2" />
<input name="var[2][name2]" value="2" />
<input name="var[2][name3]" value="2" />
<button>Send</button>
</form>

И чтобы это сделать без $_REQUEST не обойтись никак? Структуру данных (их представление) организовываете вы, а не массивы-волшебники за вас.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования