Заполните многомерный массив - PullRequest
1 голос
/ 27 ноября 2011

Я пытаюсь заполнить многомерный массив с помощью CodeIgniter.В приведенном ниже коде внешний цикл foreach повторяется 2 раза.Внутренний foreach зацикливается 3 раза, а затем 2 раза.Проблема, с которой я сталкиваюсь, состоит в том, что мой полученный $ data ['tc'] содержит один массив, содержащий 5 элементов, но я хочу в итоге получить 2 массива, содержащих 2 и 3 элемента соответственно.

$bd = $this->db->query("SELECT tbltc.BILLED FROM tbltc WHERE tbltc.PN = $pn AND tbltc.Y = $taxyear AND tbltc.SCENARIO = $scenario GROUP BY BILLED");

foreach ($bd->result() as $bdrow) {
    $tcbd = $this->db->query("SELECT tbltc.BILLED, tbltc.TC, tbltc.CAT FROM tbltc WHERE tbltc.PN = $pn AND tbltc.Y = $taxyear AND tbltc.SCENARIO = $scenario AND tbltc.BILLED = '".$bdrow->BILLED."' GROUP BY TC");

        foreach ($tcbd->result() as $row) {
            $tmp[] = array( $row->BILLED => $row->TC);
            }

    $data['tc'] = $tmp; 
}

В настоящее времяЯ получаю массив, который выглядит следующим образом:

Array
(
    [0] => Array
        (
            [2011-11-18 00:00:00] => C
        )

    [1] => Array
        (
            [2011-11-18 00:00:00] => I
        )

    [2] => Array
        (
            [2011-11-18 00:00:00] => S
        )

    [3] => Array
        (
            [2011-11-22 00:00:00] => C
        )

    [4] => Array
        (
            [2011-11-22 00:00:00] => S
        )

)

Но мне нужно разбить его на два отдельных массива: один для даты 2011-11-18 и один для 2011-11-22Дата.Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 декабря 2011

У вас на самом деле есть куча проблем в вашем коде. Если я что-то упустил, ваши запросы излишни:

"SELECT tbltc.BILLED FROM tbltc 
WHERE tbltc.PN = $pn AND tbltc.Y = $taxyear AND tbltc.SCENARIO = $scenario 
GROUP BY BILLED"

"SELECT tbltc.BILLED, tbltc.TC, tbltc.CAT FROM tbltc 
WHERE tbltc.PN = $pn AND tbltc.Y = $taxyear AND tbltc.SCENARIO = $scenario 
AND tbltc.BILLED = '".$bdrow->BILLED."' 
GROUP BY TC"

Вы выбираете данные из той же таблицы на основе одного и того же сценария $ pn, $ taxyear и $. Получив первый набор результатов, вы перебираете его, чтобы передать BILLED во второй запрос. Это совершенно не нужно и может быть достигнуто только с помощью второго запроса, удалив $ bdrow-> BILLED

"SELECT tbltc.BILLED, tbltc.TC, tbltc.CAT FROM tbltc 
WHERE tbltc.PN = $pn AND tbltc.Y = $taxyear AND tbltc.SCENARIO = $scenario 
GROUP BY TC"

Во-вторых, у вас есть GROUP BY в обоих запросах, но у вас нет функций count (), sum () или других агрегатных функций. Чего пытаются достичь с помощью GROUP BY? Итак, давайте возьмем это сейчас ради упражнений. Теперь у вас есть один запрос с декартовым результатом. Вот код

$tcbd = $this->db->query("SELECT tbltc.BILLED, tbltc.TC, tbltc.CAT FROM tbltc WHERE tbltc.PN = $pn AND tbltc.Y = $taxyear AND tbltc.SCENARIO = $scenario");
$data = array();
foreach ($tcbd->result() as $row) {
    $data[$row->BILLED][] = $row->TC;
}

даст вам

Array
(
    [2011-11-18 00:00:00] => Array
        (
             [0] => C,
             [1] => I,
             [2] => S
        ),
    [2011-11-22 00:00:00] => Array
        (
             [0] => C,
             [1] => S
        )
)

ключевые позиции могут отличаться - я просто набрал результаты на основе ваших данных

0 голосов
/ 27 ноября 2011

До:

$bd = $this->db->query("SELECT tbltc.BILLED FROM tbltc WHERE tbltc.PN = $pn AND tbltc.Y =         $taxyear AND tbltc.SCENARIO = $scenario GROUP BY BILLED");

foreach ($bd->result() as $bdrow) {
    $tcbd = $this->db->query("SELECT tbltc.BILLED, tbltc.TC, tbltc.CAT FROM tbltc WHERE tbltc.PN = $pn AND tbltc.Y = $taxyear AND tbltc.SCENARIO = $scenario AND tbltc.BILLED = '".$bdrow->BILLED."' GROUP BY TC");

    foreach ($tcbd->result() as $row) {
        $tmp[] = array( $row->BILLED => $row->TC);
    }

    $data['tc'] = $tmp; 
}
  • $ tmp никогда не сбрасывается
  • $ data ['tc'] всегда будет перезаписываться при каждом цикле
  • должен инициализировать вашу переменную

После того, как:

$bd = $this->db->query("SELECT tbltc.BILLED FROM tbltc WHERE tbltc.PN = $pn AND tbltc.Y =         $taxyear AND tbltc.SCENARIO = $scenario GROUP BY BILLED");
$data = array();
foreach ($bd->result() as $bdrow) {
    $tcbd = $this->db->query("SELECT tbltc.BILLED, tbltc.TC, tbltc.CAT FROM tbltc WHERE tbltc.PN = $pn AND tbltc.Y = $taxyear AND tbltc.SCENARIO = $scenario AND tbltc.BILLED = '".$bdrow->BILLED."' GROUP BY TC");
    $tmp = array();
    foreach ($tcbd->result() as $row) {
        $tmp[] = array( $row->BILLED => $row->TC);
    }
    $data[] = $tmp; 
}

Это должно вывести что-то вроде этого:

Array()
    [0] => Array() 
          [0] => X
          [1] => Y
    [1] => Array()
          [0] => Z
          ...
    ...
0 голосов
/ 27 ноября 2011
$tmp = array();
$dataarray = array();

foreach ($tcbd->result() as $row) {
    $dataarray['BILLED'] = $row->BILLED;
    $dataarray['TC'] = $row->TC;

    $tmp[] = $dataarray;
}

, который создаст:

Array
(
    [0] => Array
        (
            ['BILLED'] => 2011-11-18 00:00:00
            ['TC'] => C
        )

    [1] => Array
        (
            ['BILLED'] => 2011-11-18 00:00:00
            ['TC'] => I
        )

    [2] => Array
        (
            ['BILLED'] => 2011-11-18 00:00:00
            ['TC'] => S
        )

    [3] => Array
        (
            ['BILLED'] => 2011-11-18 00:00:00
            ['TC'] => C
        )

    [4] => Array
        (
            ['BILLED'] => 2011-11-18 00:00:00
            ['TC'] => S
        )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...