За последние 24 часа нас посетили 8424 программиста и 445 роботов. Сейчас ищут 72 программиста ...

Сумма отдельных значений массива

Тема в разделе "PHP для новичков", создана пользователем sqwerel, 16 апр 2018.

Метки:
  1. sqwerel

    sqwerel Новичок

    С нами с:
    9 окт 2015
    Сообщения:
    24
    Симпатии:
    0
    У меня такой вопрос... В общем я php знаю плохо, но мне нужно переделать уже существующую страничку. У меня запрос в базу, в результате чего формируется 2 массива:
    Код (Text):
    1. $array_1[$i] = $row_1['round((avg(kb)),2)']
    2. $array_2[$i] = $row_2['name']
    Выглядит это так:
    [11, 34, 2, 1, 3 ]
    [Катя, Маша, Ваня, Игорь, Даша]
    Каждое значение одного массива соответствует значению другого. Мне нужно в первом все значения меньше 10 сложить и вернуть обратно их сумму в массив вместо их самих. Значения во втором массиве, которые соответствуют суммируемым, объединить. На выходе должно быть:
    [11, 34, 6 ]
    [Катя, Маша, Остальные]
    Находились только примеры среза массива и суммы вообще всего, что есть, а мне нужно задать условия для каждого элемента.
     
  2. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    78
    Симпатии:
    9
    Можно сделать ассоциативный массив и с ним работать. Если интересует именно сложить 3 числа, то
    PHP:
    1. //Если там числа
    2. $Sum = $arr[2] + $arr[3] + $arr[4];
    3. //Если стороки, то так
    4. $Sum = (int)$arr[2] + (int)$arr[3] + (int)$arr[4];
    Я бы сделал так, если все по задаче делать:
    PHP:
    1. <?php
    2. $array = [11, 34, 2, 1, 3 ];
    3. $out = [];
    4. $out2 = 0;
    5.              
    6. foreach( $array as $key => $value ){
    7.     if($key <= 1){
    8.         array_push($out, $value);
    9.     } else {
    10.         $out2 += $value;
    11.     }
    12. }
    13.  
    14. array_push($out, $out2);
    15.  
    16. var_dump($out);
    Код (Text):
    1. array(3) {
    2.   [0]=>
    3.   int(11)
    4.   [1]=>
    5.   int(34)
    6.   [2]=>
    7.   int(6)
    8. }
     
    #2 AnonimS, 16 апр 2018
    Последнее редактирование: 16 апр 2018
  3. sqwerel

    sqwerel Новичок

    С нами с:
    9 окт 2015
    Сообщения:
    24
    Симпатии:
    0
    Спасибо, но у меня там больше сотни значений. Не понимаю, как вставить это в мой код,
    Код (Text):
    1. $query="select name,round((avg(kb)),2) from table group by name";
    2. $result=mysql_query($query);
    3. $num_result=mysql_num_rows($result);
    4. $j=0;
    5. for ($i=0; $i <$num_result; $i++)
    6.   {
    7.    $row=mysql_fetch_array($result);
    8.    $array_1[$i]=$row_1['round((avg(kb)),2)'];
    9.    $sum_1=$array_1[$i]+$sum_1;
    10.    $array_2[$i]=$row_2['name'];
    11.    $_SESSION['array_1'][$j]=$array_1[$i];
    12.    $_SESSION['array_2'][$i]=$array_2[$i];
    13.    $j=$j+1;
    14. }
    15. $_SESSION['num_result'] =$num_result;
    Вот где-то в середине нужно вставить что-то типа for i in $array_1[$i] if i <=10 делать сумму и удалять суммируемое значение, а потом за циклом саму сумму как значение приписать через array_push. Сорян, правда не вкуриваю:(
     
  4. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    489
    Симпатии:
    113
    @sqwerel, где-то в середине проверять - да, надо. Но не надо удалять и прочее... вот, например:
    PHP:
    1. $other_sum = 0;
    2. $other_name = 'Остальные';
    3. while(($row = mysql_fetch_assoc($result)) !== false) {
    4.    if($row_1['round((avg(kb)),2)'] >= 10) {
    5.     $_SESSION['array_1'][] = $array_1[] = $row_1['round((avg(kb)),2)'];
    6.     $_SESSION['array_2'][] = $array_2[] = $row_2['name'];
    7.    } else {
    8.        $other_sum += $row_1['round((avg(kb)),2)'];
    9.    }
    10.    $sum_1 += $row_1['round((avg(kb)),2)'];
    11. }
    12. if($other_sum > 0) {
    13.     $_SESSION['array_1'][] = $array_1[] = $other_sum;
    14.     $_SESSION['array_2'][] = $array_2[] = $other_name;
    15. }
    И не нужны ни i, ни j...
    Попробуйте заменить строки с 4-й по 14-ю...
     
    sqwerel нравится это.
  5. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    489
    Симпатии:
    113
    Да и тут запись в $_SESSION['array_1'] и _2 надо перенести в завершающую часть (целиком исходные массивы копировать), а в начале - инициализировать массивы $array_1 и _2.
     
  6. sqwerel

    sqwerel Новичок

    С нами с:
    9 окт 2015
    Сообщения:
    24
    Симпатии:
    0
    Хм, кое-что работает. Спасибо! Мне массивы эти для графиков нужны были. name-легенда, kb-сами доли на диаграмме. Вот легенда действительно меняется (на other), а деления остались старые (и количество и размер). Вот ещё интересно, для другого случая задали условие $row_1['round((avg(kb)),2)']>=1000000, такой формат уже не воспринимается... то есть предел 10000. Интересно...
    Ещё раз спасибо.
     
  7. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    489
    Симпатии:
    113
    Вероятно, для них используется ранее вычисленный $num_result.
    Замените его, например, на итоговую длину массива $array_1.
     
    sqwerel нравится это.
  8. sqwerel

    sqwerel Новичок

    С нами с:
    9 окт 2015
    Сообщения:
    24
    Симпатии:
    0
    Всё, как можно было догадаться, программная ошибка сидит в полуметре от монитора. В запросе были проблемы в вычислениях, потому значения одного из массивов шли в 10 раз больше. Сейчас работает как нужно!