Фильтрация по нескольким запросам SQL для создания одного массива - нужны указатели - PullRequest
0 голосов
/ 28 марта 2012

Я новичок в веб-разработке.

Это часть телефонной службы, и я пытаюсь отфильтровать 3 различных массива, заполненных строками из трех запросов к базе данных: $ sfaa, $ sfipc и $ sfuaa.Мне нужно отфильтровать три массива базы данных, чтобы найти доступных агентов обслуживания клиентов.Выводом будет массив, заполненный IVR_Number для набора.

Вот пример строки: "Id", "IVR_Number", "Market_Id" "

Я должен взорватьстрока для того, чтобы получить мои данные от каждого значения в массивах.Затем, основываясь на идентификаторе «один ко многим» в каждой строке, я должен проверить, находится ли идентификатор из $ sfaa в $ sfipc или $ sfuaa.Если нет, то мне нужно построить массив с отфильтрованными записями, оттуда я должен найти значение из разобранной строки в $ sfaa, которая принадлежит этому идентификатору.Я написал следующий код, но есть более простой способ ??Я надеюсь .... Клиент должен ждать этих результатов, прежде чем двигаться вперед.Обычно есть только 10 или 15 записей.

Этот код работает. Мне просто интересно, есть ли более простой способ сделать это

Любые советы

// formalua needed to filter above results and fill $aadl array
        // explode each active agent array
        $activeagentsfec=0;
        $aaivra= array();
        $aaida= array();
        foreach ($sfaa as $aavalue)
        {
            ${'aadetails'.$activeagentsfec} = explode("'",$aavalue);
            ${'aaivr'.$activeagentsfec} = ${'aadetails'.$activeagentsfec}[5];
            ${'aaid'.$activeagentsfec} = ${'aadetails'.$activeagentsfec}[1];
            array_push($aaivra, ${'aaivr'.$activeagentsfec});
            array_push($aaida,${'aaid'.$activeagentsfec});
            $activeagentsfec++;
        }
        // explode each inprogress call array
            $activecallsfec=0;
            $actida= array();
            $acfida= array();
        foreach ($sfipc as $acvalue)
        {
            ${'acdetails'.$activecallsfec} = explode("'",$acvalue);
            ${'actid'.$activecallsfec} = ${'acdetails'.$activecallsfec}[5];
            ${'acfid'.$activecallsfec} = ${'acdetails'.$activecallsfec}[7];
            array_push($actida, ${'actid'.$activecallsfec});
            array_push($acfida, ${'acfid'.$activecallsfec});
            $activecallsfec++;
        }
        // explode each unvailable agent
            $unavailableagentsfec=0;
            $uaaida= array();
        foreach ($sfuaa as $uavalue)
        {
            ${'uadetails'.$unavailableagentsfec} = explode("'",$uavalue);
            ${'uaaid'.$unavailableagentsfec} = ${'uadetails'.$unavailableagentsfec}[3];
            array_push($uaaida, ${'uaaid'.$unavailableagentsfec});
            $unavailableagentsfec++;
        } 
        // create available agent array by id
        $aaafec=0;
        $aada= array();
        foreach ($aaida as $aaidavalue)
        {
            if (in_array($aaidavalue,$actida,true))
            $aaafec++;
            elseif(in_array($aaidavalue,$acfida,true))
            $aaafec++;
            elseif(in_array($aaidavalue,$uaaida,true))
            $aaafec++;
            else
            array_push($aada, $aaidavalue);
        }
        // available agent arry by ivr
        $aadl= array();
        foreach ($aada as $aadavalue)
        {
            $aaaivrsv= array_search($aadavalue,$aaida,true);
            array_push($aadl,$aaivra[$aaaivrsv]);
        }

1 Ответ

0 голосов
/ 28 марта 2012

Учитывая то, что вы говорили в комментариях, я постараюсь дать вам несколько полезных мыслей ...

  • Вы выполняете почти тот же процесс для анализа $ sfaa, $sfipc и $ sfuaa - взорваться, получить определенные столбцы.Если бы у вас был какой-то способ абстрагировать этот процесс с помощью универсальной функции синтаксического анализа, которая возвращает данные в лучшем формате, вызываемом три раза для каждого массива, вы бы лучше увидели свой код.

  • Точно так же ваш процесс тесно связан с текущим состоянием данных - например, ${'acdetails'.$activecallsfec}[5]; - это ваш пятый элемент сегодня, но будет ли он всегда?Что-то общее, когда вы ищете столбец по имени, может избавить вас от многих проблем ...

  • наконец, при объединении данных, если данные сортируются до того, как объединение может бытьнамного быстрее - поиск N элементов в списке M, с несортированным списком, требует O (n * m) операций, но если оба отсортированы, это O (min (m, n)).

Я потратил время, чтобы просмотреть ваш код ... Если вы не используете некоторые из его переменных в другом месте, вот более короткий эквивалент:

// formula needed to filter above results and fill $aadl array
   // explode each active agent array
   $aaivra= array();
   $aaida= array();
   foreach ($sfaa as $aavalue)
   {
      $a = explode("'",$aavalue);
      array_push($aaivra, $a[5]);
      array_push($aaida,$a[1]);
   }
   // explode each inprogress call array
   $actida= array();
   $acfida= array();
   foreach ($sfipc as $acvalue)
   {
      $a = explode("'",$acvalue);
      array_push($actida, $a[5]);
      array_push($acfida, $a[7]);
   }
   // explode each unvailable agent
   $uaaida= array();
   foreach ($sfuaa as $uavalue)
   {
      $a= explode("'",$uavalue);
      array_push($uaaida, $a[3]);
   } 
   // create available agent array by id
   $aada= array();
   foreach ($aaida as $aaidavalue)
   {
      if (!in_array($aaidavalue,$actida,true) &&
          !in_array($aaidavalue,$acfida,true) &&
          !in_array($aaidavalue,$uaaida,true))
         array_push($aada, $aaidavalue);
   }
   // available agent arry by ivr
   $aadl= array();
   foreach ($aada as $aadavalue)
   {
      $aaaivrsv= array_search($aadavalue,$aaida,true);
      array_push($aadl,$aaivra[$aaaivrsv]);
   }
...