сгруппировать многомерный массив по значениям в php - PullRequest
2 голосов
/ 20 мая 2011

У меня есть массив, который содержит следующие данные:

$students_array = array();
$students_array[] = array("class" => 1, "sid" => "s00123");
$students_array[] = array("class" => 2, "sid" => "s00456");
$students_array[] = array("class" => 1, "sid" => "s008765");
$students_array[] = array("class" => 1, "sid" => "s008987");
$students_array[] = array("class" => 3, "sid" => "s008789");
$students_array[] = array("class" => 3, "sid" => "s008543");

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

Array
(
  [1] => Array
    (
        [0] => Array
            (
                [sid] => "s00123"
            )

        [1] => Array
            (
                [sid] => "s008765"
            )

        [2] => Array
            (
                [sid] => "s008987"
            )

    )

  [2] => Array
    (
        [0] => Array
            (
                [sid] => "s00456"
            )
    )

  [3] => Array
    (
        [0] => Array
            (
                [sid] => "s008789"
            )
        [1] => Array
            (
                [sid] => "s008543"
            )
    )

 )

Код, который я использую,

$class_array = array();
foreach($students_array as $sa) {
    if(isset($class_array[$sa['class']])) {
        $inner_array = array();
        $inner_array["sid"] = $sa['sid'];
        $class_array[$sa['class']][]= $inner_array;
    } else {
        $inner_array = array();
        $inner_array["sid"] = $sa['sid'];
        $class_array[$sa['class']][]= $inner_array;
    }
}

, который работает для меня, но есть ли лучшее решение или какие-либо встроенные функции PHP для этого?

Ответы [ 2 ]

7 голосов
/ 20 мая 2011
$class_array = array();
foreach ($students_array as $sa) {
    $class_array[$sa['class']][] = array('sid' => $sa['sid']);
}
0 голосов
/ 20 мая 2011

Я думаю, что ваш код может быть переписан как (не проверено):

$out = array();
foreach ($students_array as $row) {
    extract($row);
    if (!defined($out[$class])) {
        $out[$class] = array();
    }
    $out[$class][] = array('sid' => $sid);
}

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

...