За последние 24 часа нас посетили 18437 программистов и 1600 роботов. Сейчас ищут 937 программистов ...

Как удалять из много мерного массива элементы по условию

Тема в разделе "PHP для новичков", создана пользователем Bkmz, 15 июл 2016.

  1. Bkmz

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

    С нами с:
    28 июл 2008
    Сообщения:
    5
    Симпатии:
    0
    Есть таблица в mysql.
    Она имеет если упрощенно такой вид:
    -------------------
    | callid | status |
    -------------------
    | 1 | an |
    -------------------
    | 1 | an |
    -------------------
    | 1 | no an |
    -------------------
    | 2 | an |
    -------------------
    | 2 | no an |
    -------------------
    | 3 | no an |
    -------------------

    Я получаю из него 1000 записей. Как исключить из результата все записи со имеющее в status "no an" если была хоть одна запись с таким же callid но со status "an"

    Я решил приблизительно так: Но чувствую решил я или неправильно или не оптимально или и то и другое

    PHP:
    1. <?php
    2.  
    3. // Данные для отладки
    4. $data[0] = array("agent"=>"a1", "disposition"=>"ANSWERED", "callid"=>"12");
    5. $data[1] = array("agent"=>"a2", "disposition"=>"NO ANSWER", "callid"=>"12");
    6. $data[2] = array("agent"=>"a3", "disposition"=>"NO ANSWER", "callid"=>"12");
    7. $data[3] = array("agent"=>"a4", "disposition"=>"NO ANSWER", "callid"=>"13");
    8. $data[4] = array("agent"=>"a5", "disposition"=>"ANSWERED", "callid"=>"13");
    9. $data[5] = array("agent"=>"a6", "disposition"=>"BUSY", "callid"=>"13");
    10. $data[6] = array("agent"=>"a7", "disposition"=>"NO ANSWER", "callid"=>"14");
    11.  
    12.  
    13.  
    14. // Отладка
    15. print ("<pre>");      
    16. print_r($data);
    17. print ("</pre>");
    18.  
    19. $for_del = array();
    20.  
    21. for ($i = 0; $i < count($data); $i++) {
    22.     if ($data[$i]['disposition'] == "ANSWERED") {
    23.         for ($j = 0; $j < count($data); $j++) {
    24.             if ($data[$j]['callid'] == $data[$i]['callid'] AND $data[$j]['disposition'] == "NO ANSWER") {
    25.                 $for_del[] = $j;  
    26.             }
    27.         }
    28.     }
    29. }
    30.  
    31. foreach ($for_del as $key => $value){
    32.    unset($data[$value]);
    33. }
    34.  
    35. // Отладка
    36. print ("<pre>");      
    37. print_r($data);
    38. print ("</pre>");
    39.  
    40. echo json_encode($data);
    41.  
    42. ?>
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    лучше это решить на уровне запроса в БД
     
  3. Bkmz

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

    С нами с:
    28 июл 2008
    Сообщения:
    5
    Симпатии:
    0
    А как?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Запрос к субд грамотно составить. Кэп.
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    сразу выбрать только те записи которые нужно, а не выбирать все а потом вручную их чистить.
    В данном случае зависит от сути задачи. Нужно выбрать только те где есть хоть один callid со status "an". остальное шелуха.
    выбираем их, группируем по callid и получаем список callid который нас интересует.
     
  6. Bkmz

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

    С нами с:
    28 июл 2008
    Сообщения:
    5
    Симпатии:
    0
    Перефразирую задачу нужно выбирать все записи кроме тех у которых status равно "no an" только в том случае если есть с таким же callid запись со status равном "an"
    --- Добавлено ---
    Можно с этого места по подробней