PHP: проблемы с массивом $ _POST - PullRequest
3 голосов
/ 22 февраля 2011

Я собираюсь задать вопрос, касающийся проблемы, с которой я сталкиваюсь, и постараюсь выяснить это на основе информации от ваших ребят Я выложу исходный код, если ДЕЙСТВИТЕЛЬНО не смогу его получить, но я пойду ...

Итак, у меня есть форма, которая отображает поля по вертикали. Все это выпадающее меню, а в самом конце кнопка отправки. Там есть немного javascript, который позволяет мне добавить новую строку без обновления страницы. Таким образом, для каждого ключа никогда не бывает одинакового количества массивов $ _POST. Ключ, который меня беспокоит (ну, все они, но как только он заработает, он будет работать для всех) - это выпадающий список $_POST['monworkhours']. Это выпадающий список с различными часами работы. Я считаю, что проблема заключается в том, что мне нужно перебрать весь массив $_POST['monworkhours'] в зависимости от представления. Я точно не знаю, как это сделать .

Кроме того, «проблема» вызывает одинаковые результаты для каждой строки вывода. Поэтому все, что я установил для первого поля, в конечном итоге будет результатом для каждой дополнительной строки, которую я «добавил» с помощью функции javascript.

Любая помощь приветствуется.

Форма:

<select name="monshifthours[]" id="monshifthours">
        <option value="OFF">OFF</option>
    <optgroup label="Front/Back Half">
        <option value="7am7pm">7AM-7PM</option>
        <option value="7pm7am">7PM-7AM</option>           
        <option value="7am7pmalt">7AM-7PM (Alt)</option>
        <option value="7pm7amalt">7PM-7AM (Alt)</option>
    </optgroup>
    <optgroup label="Monday - Friday">
        <option value="630am330pm">630AM-330PM</option>
        <option value="7am4pm">7AM-4PM</option>
        <option value="8am5pm">8AM-5PM</option>
        <option value="10am7pm">10AM-7PM</option>
    </optgroup>
  </select>

Вывод $ _POST (2 строки формы):

 ["monshifthours"]=>
  array(2) {
    [0]=>
    string(6) "7am7pm"
    [1]=>
    string(6) "7pm7am"
  }

Скриншот: enter image description here

getCellColor () Функция:

function getCellColor($dow) {
      foreach($_POST[$dow . 'shifthours'] as $key=> $hour) {
          echo $count;
          if ($hour == "7am7pmalt") {
              return "style=\"background: yellow; color:#000;\"";
          }
          elseif ($hour == "OFF") {
              return    "style=\"background: red; color:#fff;\"";
          }
          else {
              return "style=\"background: green; color:#fff;\"";
          }
    }
}

Для представления вывода:

if (isset($_POST['submit'])) {
    echo preTableFrmt();
    foreach($engineer as $a => $b) {
        echo "| [[$engineer[$a]]] || ".getCellColor('mon')." | $monday[$a] || ".getCellColor('tues')." | $tuesday[$a] || ".getCellColor('wed')." | $wednesday[$a] || ".getCellColor('thur')." | $thursday[$a] || ".getCellColor('fri')." | $friday[$a] || ".getCellColor('sat')." | $saturday[$a] || ".getCellColor('sun')." | $sunday[$a] <br />|-<br />";
    }
    echo postTableFrmt();
}
else { echo "Waiting for data..."; }

Примечание: при отправке одной строки формы все в порядке; это когда у меня больше одного; тогда я получаю дубликат информации.

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

Изображение приложения: enter image description here

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

|-
| [[Drew Decker]] || style="background: yellow; color:#000;" | 7am7pmalt || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF ||  |  || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF 
|-
| [[Drew Decker]] || style="background: yellow; color:#000;" | 7pm-7am || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF ||  |  || style="background: red; color:#fff;" | OFF || style="background: red; color:#fff;" | OFF 

Примечание: дубликаты здесь style="background: yellow; color:#000;".

Мое общее решение
Итак, я решил найти решение, которое не требовало от меня изменения кода формы. Я не верю, что мне нужно было изменить код формы, поскольку он динамический. Обычно, если я записывал это в базу данных и отправлял в базу данных несколько строк данных формы, я вижу, где это важно, однако в этой ситуации я не верю, что это было правильное решение. Тем не менее, я благодарю и ценю все вдумчивые и информационные ответы, которые я получил.

В итоге я изменил функцию getCellColor() на следующую:

function getCellColor($index,$dow) {
        if ( isset($_POST[$dow . 'shifthours'][$index]) && ($_POST[$dow . 'shifthours'][$index] == "7am7pmalt" || $_POST[$dow . 'shifthours'][$index] == "7pm7amalt")) {
            return "style=\"background: yellow; color:#000;\"";
        }
        elseif ($_POST[$dow . 'shifthours'][$index] == "OFF") {
            return  "style=\"background: red; color:#fff;\"";
        }
        else {
            return "style=\"background: green; color:#fff;\"";
        }
}

Мой foreach теперь выглядит так:

foreach($engineer as $a => $b) {
    echo "|-<br />| [[$engineer[$a]]] || ".getCellColor($a,"mon")." | ".format_date($monday[$a])." || ".getCellColor($a,"tues")." | ".format_date($tuesday[$a])." || ".getCellColor($a,"wed")." | ".format_date($wednesday[$a])." || ".getCellColor($a,"thur")." | ".format_date($thursday[$a])." || ".getCellColor($a,"fri")." | ".format_date($friday[$a])." || ".getCellColor($a,"sat")." | ".format_date($saturday[$a])." || ".getCellColor($a,"sun")." | ".format_date($sunday[$a])."<br />";
}

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

Ответы [ 4 ]

1 голос
/ 23 февраля 2011

Итак, я решил найти решение, которое не требовало от меня изменения кода формы. Я не верю, что мне нужно было изменить код формы, поскольку он динамический. Обычно, если я записывал это в базу данных и отправлял в базу данных несколько строк данных формы, я вижу, где это важно, однако в этой ситуации я не верю, что это было правильное решение. Тем не менее, я благодарю и ценю все вдумчивые и информационные ответы, которые я получил.

Я закончил тем, что изменил функцию getCellColor() на следующее:

function getCellColor($index,$dow) {
        if ( isset($_POST[$dow . 'shifthours'][$index]) && ($_POST[$dow . 'shifthours'][$index] == "7am7pmalt" || $_POST[$dow . 'shifthours'][$index] == "7pm7amalt")) {
            return "style=\"background: yellow; color:#000;\"";
        }
        elseif ($_POST[$dow . 'shifthours'][$index] == "OFF") {
            return  "style=\"background: red; color:#fff;\"";
        }
        else {
            return "style=\"background: green; color:#fff;\"";
        }
}

Мой foreach теперь выглядит так:

foreach($engineer as $a => $b) {
    echo "|-<br />| [[$engineer[$a]]] || ".getCellColor($a,"mon")." | ".format_date($monday[$a])." || ".getCellColor($a,"tues")." | ".format_date($tuesday[$a])." || ".getCellColor($a,"wed")." | ".format_date($wednesday[$a])." || ".getCellColor($a,"thur")." | ".format_date($thursday[$a])." || ".getCellColor($a,"fri")." | ".format_date($friday[$a])." || ".getCellColor($a,"sat")." | ".format_date($saturday[$a])." || ".getCellColor($a,"sun")." | ".format_date($sunday[$a])."<br />";
}

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

1 голос
/ 22 февраля 2011

Цикл по $ _POST ['monworkhours'] тривиален:

foreach ($_POST['monworkhours'] as $i => $value){
    // Do something
}

Не видя больше кода, я не могу сказать, в чем ваша проблема.Вы выбираете значения в HTML (например, <option value="7am7pm" selected>7AM-7PM</option>) или с помощью javascript?

Если это javascript, это может быть связано с тем, что вы используете один и тот же идентификатор для нескольких элементов.Это технически неверно.Вы можете использовать последовательно пронумерованные идентификаторы, например, так:

<select name="monshifthours_0" id="monshifthours_0">
...
<select name="monshifthours_1" id="monshifthours_1">

, а затем перебирать их в PHP следующим образом:

$i = 0;
while (isset($_POST["monshifthours_$i"])){
    // Do something
    $i++;
}

Если ничего из этого не помогло, напишите больше кода.Гораздо больше.

1 голос
/ 22 февраля 2011

Мне кажется, я понимаю вашу проблему сейчас. Ваша проблема в том, что после отправки формы этот код запускается:

foreach($engineer as $a => $b) {             
    echo "| [[$engineer[$a]]] || ".getCellColor('mon')." | ...";
}  

Итак, другими словами, для каждого инженера вы запускаете функцию getCellColor ();

Теперь функция getCellColor () также выполняет полный цикл и оценивает все опубликованные элементы, поэтому возвращает результат последней строки формы.

function getCellColor($dow) {
    foreach($_POST[$dow . 'shifthours'] as $key=> $hour) {   
    ...
    }
}

Итак, другими словами, вот что происходит:

  • цикл foreach (инженер) запускается
  • foreach (инженер) получает инженера 1
  • внутри инженера 1, getCellColor запускается
  • getCellColor оценивает каждую строку и возвращает значение последней строки
  • foreach (инженер) зацикливается и получает инженера 2
  • внутри инженера 2, getCellColor запускается
  • getCellColor оценивает каждую строку и возвращает значение последней строки (снова)
  • ... и т. Д.

Примечание: вы говорите, что первая строка вывода верна, но на самом деле это НЕ. Каждая строка выводит результат последней строки.

В качестве предложения я бы структурировал что-то вроде того, о котором говорил Патрик Фишер в своем ответе.

<select name="aa_1"> <select name="bb_1"> <input type="hidden" name="lines[]" value="1" />
<select name="aa_2"> <select name="bb_2"> <input type="hidden" name="lines[]" value="2" />
<select name="aa_3"> <select name="bb_3"> <input type="hidden" name="lines[]" value="3" />

Таким образом, после отправки формы вы можете получать каждый элемент формы отдельно по горизонтали (т.е. построчно), а не по вертикали.

foreach($_POST["lines"] as $key => $value) { 
    ${"aa_".$value} = $_POST["aa_".$value];
    ${"bb_".$value} = $_POST["bb_".$value];
}
1 голос
/ 22 февраля 2011

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

<select name="monworkhours[]">
    <option value="aaa">aaa</option>
    <option value="bbb">bbb</option>
    <option value="ccc">ccc</option>
</select>

<select name="monworkhours[]">
    <option value="ddd">ddd</option>
    <option value="eee">eee</option>
    <option value="fff">fff</option>
</select>

после отправки этой формы, $ _POST ['monworkhours'], мы надеемся, будет массивом.Я не проверял это, но я не понимаю, почему это не сработает.

...