За последние 24 часа нас посетили 22745 программистов и 1260 роботов. Сейчас ищет 751 программист ...

Условие для выборки данных с базы в массив

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

  1. proVas

    proVas Новичок

    С нами с:
    2 ноя 2018
    Сообщения:
    2
    Симпатии:
    0
    Всем привет, я пока новичек, вот уже третий день пытаюсь сделать правильное условие для отбора данных в массив.
    Все шансы проваливаются, что только не делал. Помогите.

    Нужно правильно составить условие. Если name и link совпадают, и у них разные value, то занести в массив где value нужно прибавить, а тот value который мы взяли больше не учтывать. Если же name и link совпадают, и у них одинаковый value, то не брать эту строку, а лучше вообще убрать.
    Дальше, если name или link разные, то так же записать в массив.

    id name link value
    1 box1 XPOL 1
    2 box2 XERR 2
    3 box1 XPOL 3
    4 box2 POLL 1
    5 box3 LKOO 2
    6 box1 XPOL 1

    Из таблицы выше должно получиться:

    id name link value
    1 box1 XPOL 4
    2 box2 XERR 2
    4 box2 POLL 1
    5 box3 LKOO 2

    Я делал так. Два цикла, где все проверяется.
    PHP:
    1. $Array; //Тут массив с данными из базы.
    2. $Viborka = []; //Тут массив куда будем все записывать
    3. $m = 0; //Счетчик для массива
    4. for($i=1;$i<=count($specificationPipe);$i++){
    5.   for($l=1;$l<=count($specificationPipe);$l++){
    6.   if($Array[$i-1]['name'] == $Array[$l-1]['name'] && $Array[$i-1]['link'] == $Array[$l-1]['link'] && $Array[$i-1]['value']!==$Array[$l-1]['value']){
    7.   $Viborka[$m]['name'] = $Array[$i-1]['name'];
    8.   $Viborka[$m]['link'] = $Array[$i-1]['link'];
    9.   $Viborka[$m]['value'] = $Array[$i-1]['value'] + $Array[$l-1]['value'];
    10.   }
    11. }
    12. //То что выше все норм прибавляет.

    Но дальше начинается кошмар. Как только не далал, ошибка в том что после отбора в массив, я не делаю проверку на то чтобы, больше отобранный элемент не брался.
    Спасибо всем кто откликнется.
     
  2. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @proVas, БД вам не помойка, вы наверно удивитесь, но база данных нужна не для хранения информации (!).
    Она нужна для хранения и обработки информации. 99% у вас неправильная архитектура БД, поэтому у вас все черти с переломанными ногами. Самое грустное, что мало кто решается сделать шаг назад и исправить ранее допущенные ошибки. Вместо этого тратят кучу времени на "костыли", не замечая как затягивают петлю на собственной шее. А потом называют БД "узким местом". (конец гневной тирады)

    @proVas, БД будем нормализовать или как? :)
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Valick, тут скорее вопрос в использовании группировки и агрегатных функций в запросе. Вполне возможно, что в таблице хранится не только `value`, но и ещё пачка данных (timestamp, например).
    @proVas, ну а для этого тяжёлого случая есть вариант:
    PHP:
    1. $arr = [
    2.     ['name' => 'box1', 'link' => 'XPOL', 'value' => '1'],
    3.     ['name' => 'box2', 'link' => 'XERR', 'value' => '2'],
    4.     ['name' => 'box1', 'link' => 'XPOL', 'value' => '3'],
    5.     ['name' => 'box2', 'link' => 'XERR', 'value' => '1'],
    6.     ['name' => 'box3', 'link' => 'LKOO', 'value' => '2'],
    7.     ['name' => 'box1', 'link' => 'XPOL', 'value' => '1'],
    8. ];
    9.  
    10. $n = count($arr);
    11. foreach($arr as $key => $value) {
    12.     if(array_key_exists($key, $arr)) {
    13.         for($i = $key + 1; $i < $n; $i++) {
    14.             if(!array_key_exists($i, $arr)) {
    15.                 continue;
    16.             }
    17.             if($arr[$key]['name'] !== $arr[$i]['name'] || $arr[$key]['link'] !== $arr[$i]['link']) {
    18.                 continue;
    19.             }
    20.             $arr[$key]['value'] += $arr[$i]['value'];
    21.             unset($arr[$i]);
    22.         }
    23.     }
    24. }
    25. var_dump($arr);
     
    proVas нравится это.
  4. proVas

    proVas Новичок

    С нами с:
    2 ноя 2018
    Сообщения:
    2
    Симпатии:
    0
    Спасибо!))