Или, если для третьего параметра установлено значение true, вы получите:

я есть таблица базы данных, которая выглядит так:

uid | group  | category
1   | group1 | cat1
2   | group1 | cat2
3   | group2 | cat3
4   | group2 | cat4
5   | group2 | cat5
6   | group3 | cat6
7   | group3 | cat7

Но мне нужны эти данные в массиве, который группирует категории поgroup.

Например, мой массив должен выглядеть так:

Array
(
    [group1] => Array
        (
            [0] => Array
                (
                    [0] => 1
                    [1] => cat1

                )

            [1] => Array
                (
                    [0] => 2
                    [1] => cat2
                )

        )

    [group2] => Array
        (
            [0] => Array
                (
                    [0] => 3
                    [1] => cat3
                )

            [1] => Array
                (
                    [0] => 4
                    [1] => cat4
                )

            [2] => Array
                (
                    [0] => 5
                    [1] => cat5
                )

        )

    [group3] => Array
        (
            [0] => Array
                (
                    [0] => 6
                    [1] => cat6
                )
            [1] => Array
                (
                    [0] => 7
                    [1] => cat7
                )

        )

)

Я написал цикл foreach, который делает именно это, но у меня есть проблема.

Моя проблема в том, что он всегда пропускает самый последний ряд таблицы, и я не уверен, как это исправить. На мой взгляд, логика диктует, что это должно работать всегда.

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

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

Мне также было бы интересно посмотреть, какие улучшения я могу сделать в моем текущем коде, но это может быть лучшим вопросом для пересмотра кода.

Моя петля:

$pass = [];
foreach($stmt as $key => $value) {
    if(empty($currentGroup)) $currentGroup = $value['group'];
    if(empty($temp)) $temp = [];
    if($currentGroup != $value['group'] || $key+1 == count($stmt)) {
        $pass[$currentGroup] = $temp;
        $currentGroup = $value['group'];
        $temp = [];
        $temp[] = [$stmt[$key]['uid'], $stmt[$key]['category']];
    } else {
        $temp[] = [$stmt[$key]['uid'], $stmt[$key]['category']];
    }
}

Ответы на вопрос(1)

Решение Вопроса

Следующие должны сделать это:

<?php

//Create an array to store our grouped rows
$grouped = array();

//Loop over all rows returned by the $stmt that has been executed.
//You could probably remove the key from here, it's not needed it seems.
//The keys within the $value array will match the names of the columns in 
//the database,
foreach($stmt as $key => $value){

    //As we're storing by the group value from the row we first want to
    //check if our grouped array contains a key for the group of the row
    //being processed. If it does not, create an empty array within the
    //grouped data for this group.
    if(!array_key_exists($value['group'], $grouped)){
        $grouped[$value['group']] = array();
    }

    //Knowing we will always have an array element for the rows group
    //we can blindly append the values for this row to the grouped 
    //container using its values.
    //'[] =' is just short hand append.
    $grouped[$value['group']][] = array(
        $value['uid'],
        $value['category']
    );
}

Надеюсь, это поможет!

Для дальнейшего подтверждения этого цикла вы можете изменитьдобавление сгруппированных значений к следующему:

<?php

//Setting the whole row (minus the group) rather than just the uid 
//and category explicitly allows this code to work without modification
//as the datatable changes, ie. new columns. Assuming that is the 'group'
//column remains present
unset($value['group']);
$grouped[$value['group']][] = $value;

Доступ к данным сгруппированного содержимого теперь можно получить с помощью следующего:

<?php

//Acceess data via column name not array index, yay!
echo $grouped['group1']['uid']
 JParkinson199129 сент. 2017 г., 16:00
Нет проблем, я добавил еще несколько комментариев о коде, прочитал и дал мне знать, если вам нужны другие указатели.
 GrumpyCrouton29 сент. 2017 г., 16:22
У вас есть синтаксическая ошибка здесьif(!array_key_exists($value['group'], $grouped){Вы пропускаете и заканчиваете круглые скобки. Кроме того, я смог сократить его с 9 строк кода до 4 строк кодаpastebin.com/jMbEF9PV для любых будущих читателей
 JParkinson199129 сент. 2017 г., 16:27
Исправлена ​​ошибка синтаксиса. Для вашего сжатия (я бы не классифицировал его как сжатый, код такой же, просто отформатированный по-разному), я бы рекомендовал сделать ваш код максимально читабельным. Когда вы вернетесь к нему через несколько месяцев, вам будет легче снова поднять трубку. Если вы беспокоитесь о минимизированном коде для производства, это всегда можно сделать. Хотя для меня я бы всегда рекомендовал читаемый источник для комментариев.
 GrumpyCrouton29 сент. 2017 г., 15:55
Спасибо за фрагмент кода, который может оказать мне немедленную помощь, но я предпочитаюучиться что я сделал не так, и как исправить мой текущий код, или, по крайней мере, узнать, как на самом деле работает ваш фрагмент по объяснению Я могу понять ваш код, но будущие читатели не смогут.

Ваш ответ на вопрос