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

Форум PHP

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

 

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

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

тема: foreach и ассоциативные массивы
 
 автор: zetrider   (14.11.2011 в 16:31)   письмо автору
 
 

Добрый вечер,
в одном из скриптов (калькулятор) не могу правильно разделисть массивы. Формирование данных немного чудное, но так задумано изначально

Приведу пример:

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($strcheckbox0, -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] => Рассчитать
)


Есть идеи в чем проблема?

  Ответить  
 
 автор: cheops   (14.11.2011 в 18:27)   письмо автору
 
   для: zetrider   (14.11.2011 в 16:31)
 

Погодите, у вас в $calculatepricecheckbox 8 элементов, разумеется у вас будет 8 знаков - и +, так как вы прогоняете все восемь элементов подставляя индексы 2 и 4, поэтому у вас половина блоков пустые (когда нет элемента с соответствующим индексом). Перед операциями внутри foreach() лучше проверять на существование элементов $checkboxarraysum[$row_checkbox->calc_sort] при помощи isset().

  Ответить  
 
 автор: tima2010   (14.11.2011 в 18:50)   письмо автору
 
   для: cheops   (14.11.2011 в 18:27)
 

.

  Ответить  
 
 автор: ZetRider   (14.11.2011 в 19:05)   письмо автору
 
   для: 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)


так же проблема со скобкой она стоит не на месте, опять же из за того что строка уже сформирована когда происходила конкатенация строк

  Ответить  
 
 автор: ZetRider   (15.11.2011 в 10:26)   письмо автору
 
   для: cheops   (14.11.2011 в 18:27)
 

в принципе можно сделать так:

$strcheckbox[$row_checkbox->calc_sort] .= $checkboxarraysum[$row_checkbox->calc_sort].$row_checkbox->calc_valueinput;


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

  Ответить  
 
 автор: ZetRider   (15.11.2011 в 11:17)   письмо автору
 
   для: 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 ("" => "");
}
?>


спасибо.

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

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