|
|
|
| Добрый вечер,
в одном из скриптов (калькулятор) не могу правильно разделисть массивы. Формирование данных немного чудное, но так задумано изначально
Приведу пример:
html:
<form method="POST" action="#calculate" class="wp_calculate_form">
<div class="wp_calculate_description wp_calculate_description23">Чекбокс1</div>
<input type="checkbox" name="calculatepricecheckbox[][2]" value="100" class=""> 1Монтаж окон
<br />
<input type="checkbox" name="calculatepricecheckbox[][2]" value="200" class=""> 2Монтаж окон
<br />
<input type="checkbox" name="calculatepricecheckbox[][2]" value="300" class=""> 3Монтаж окон
<br />
<input type="checkbox" name="calculatepricecheckbox[][2]" value="400" class=""> 4Монтаж окон
<br />
<input type="hidden" name="calculatepricecheckboxid[23]" value="23" >
<div class="wp_calculate_description wp_calculate_description26">Чекбокс2</div>
<input type="checkbox" name="calculatepricecheckbox[][4]" value="1" class=""> 1Услуга
<br />
<input type="checkbox" name="calculatepricecheckbox[][4]" value="2" class=""> 2Услуга
<br />
<input type="checkbox" name="calculatepricecheckbox[][4]" value="3" class=""> 3Услуга
<br />
<input type="checkbox" name="calculatepricecheckbox[][4]" value="140" class=""> 4Услуга
<br />
<input type="hidden" name="calculatepricecheckboxid[26]" value="26" >
<input type="submit" value="Расчитать" class="wp_calculate_submit" name="calculate">
</form>
|
PHP
<?php
if ($_POST['calculatepricecheckbox']) {
foreach($_POST['calculatepricecheckboxid'] as $checkboxarrayid) { // из крытого поля, ID записи в БД
$res_checkbox = $wpdb->get_results("SELECT * FROM $dbcalculator WHERE (calc_type='checkbox') AND (id='$checkboxarrayid') ORDER BY `calc_sort`");
foreach ($res_checkbox as $row_checkbox) {
foreach($_POST['calculatepricecheckbox'] as $checkboxarraysumid => $checkboxarraysum) {
$strcheckbox .= $checkboxarraysum[$row_checkbox->calc_sort].$row_checkbox->calc_valueinput; // calc_sort - порядок сортировки , calc_valueinput - действие между передаными чекбоксами
}
$strcheckbox = substr($strcheckbox, 0, -1); // удаляем последнее действие присвоеное выше
$strcheckbox = $row_checkbox->calc_to."(".$strcheckbox.")".$row_checkbox->calc_after; // calc_to - дествие перед блоком данных по отношени. к предыдущему, calc_after действие после блока данных по отношению к следующему
$finishcheckbox = array ($row_checkbox->calc_sort => $strcheckbox); // calc_sort - порядок сортировка
echo "<pre>";
print_r($strcheckbox);
echo "</pre>";
}
}
}
else {
$finishcheckbox = array ("" => "");
}
?>
|
В результате должен получить: (100-100-100-100)*(1+2+3+140)
Но получаю: ((100-100-100-100----)*++++1+2+3+140)
Видимо где то напутал с циклом.
Сам передаваемый массив выглядит так:
Array
(
[calculatepricecheckbox] => Array
(
[0] => Array
(
[2] => 100
)
[1] => Array
(
[2] => 100
)
[2] => Array
(
[2] => 100
)
[3] => Array
(
[2] => 100
)
[4] => Array
(
[4] => 1
)
[5] => Array
(
[4] => 2
)
[6] => Array
(
[4] => 3
)
[7] => Array
(
[4] => 140
)
)
[calculatepricecheckboxid] => Array
(
[23] => 23
[26] => 26
)
[calculate] => Рассчитать
)
|
Есть идеи в чем проблема? | |
|
|
|
|
|
|
|
для: zetrider
(14.11.2011 в 16:31)
| | Погодите, у вас в $calculatepricecheckbox 8 элементов, разумеется у вас будет 8 знаков - и +, так как вы прогоняете все восемь элементов подставляя индексы 2 и 4, поэтому у вас половина блоков пустые (когда нет элемента с соответствующим индексом). Перед операциями внутри foreach() лучше проверять на существование элементов $checkboxarraysum[$row_checkbox->calc_sort] при помощи isset(). | |
|
|
|
|
|
|
|
для: cheops
(14.11.2011 в 18:27)
| | . | |
|
|
|
|
|
|
|
для: cheops
(14.11.2011 в 18:27)
| | cheops, спасибо, вы правы, но результат все равно не верен...
этот код плавал в голове и спасибо вам за правильное направление:
if (isset($checkboxarraysum[$row_checkbox->calc_sort])){
$strcheckbox .= $checkboxarraysum[$row_checkbox->calc_sort].$row_checkbox->calc_valueinput;
}
|
получаю:
(100-100-100-100)* // первый круг цикла
((100-100-100-100)*1+2+3+140) // второй круг цикла
|
код который формирует вышеупомянутые 2 строки:
// первая, конкатенация из данных
$strcheckbox .= $checkboxarraysum[$row_checkbox->calc_sort].$row_checkbox->calc_valueinput;
// составляем итоговую строку, она должна выглядеть так (100-100-100-100)*(1+2+3+140)
$strcheckbox = $row_checkbox->calc_to."(".$strcheckbox.")".$row_checkbox->calc_after;
|
по сути цикл проходя код первый раз в переменную $strcheckbox добавляет строку (100-100-100-100)*
но когда он проходит второй раз то дублирует 1 круга и подставляет данные из второго круга
в итоге получаем
(100-100-100-100)*
((100-100-100-100)*1+2+3+140)
|
так же проблема со скобкой она стоит не на месте, опять же из за того что строка уже сформирована когда происходила конкатенация строк | |
|
|
|
|
|
|
|
для: cheops
(14.11.2011 в 18:27)
| | в принципе можно сделать так:
$strcheckbox[$row_checkbox->calc_sort] .= $checkboxarraysum[$row_checkbox->calc_sort].$row_checkbox->calc_valueinput;
|
игнорируя все кроме последнего массива | |
|
|
|
|
|
|
|
для: ZetRider
(15.11.2011 в 10:26)
| | в итоге:
<?php
if ($_POST['calculatepricecheckbox']) {
foreach($_POST['calculatepricecheckboxid'] as $checkboxarrayid) {
$res_checkbox = $wpdb->get_results("SELECT * FROM $dbcalculator WHERE (calc_type='checkbox') AND (id='$checkboxarrayid') ORDER BY `calc_sort`");
foreach ($res_checkbox as $row_checkbox) {
foreach($_POST['calculatepricecheckbox'] as $checkboxarraysumid => $checkboxarraysum) {
if (isset($checkboxarraysum[$row_checkbox->calc_sort])){
$strcheckbox[$row_checkbox->calc_sort] .= $checkboxarraysum[$row_checkbox->calc_sort].$row_checkbox->calc_valueinput;
}
}
$strcheckbox[$row_checkbox->calc_sort] = substr($strcheckbox[$row_checkbox->calc_sort], 0, -1);
$strcheckbox[$row_checkbox->calc_sort] = $row_checkbox->calc_to."(".$strcheckbox[$row_checkbox->calc_sort].")".$row_checkbox->calc_after;
}
}
}
else {
$strcheckbox = array ("" => "");
}
?>
|
спасибо. | |
|
|
|