PHP разбивает массивы на группы на основе равных значений

У меня есть массив, содержащий массивы с 2 значениями, первый - это номер автора, второй - его аффилиация.

Array ( 
    [0] => Array ( 
            [0] => 2 
            [1] => Department of General Chemistry
        ) 
    [1] => Array ( 
            [0] => 3 
            [1] => Institute of Silicate Materials
        ) 
    [2] => Array ( 
            [0] => 4 
            [1] => Department of General Chemistry
        ) 
    [3] => Array ( 
            [0] => 5 
            [1] => Department of General Chemistry
        ) 
    [4] => Array ( 
            [0] => 6 
            [1] => Institute of Silicate Materials
        ) 
)

Как я могу сгруппировать авторов, если аффилиация одинакова? Мне нужно, чтобы результат был чем-то вроде:

3,6 Institute of Silicate Materials
2,4,5 Department of General Chemistry

Ответ 1

foreach ($array as $key => $value) {
 $return[$value[1]][] = $value[0];
}

foreach ($return as $key => $value) {
  echo implode(',', $value)." ".$key;
}

Ответ 2

<?php
//the array
$data = array(array(2,'Department of General Chemistry'),array(3,'Institute of Silicate Materials'),array(4,'Department of General Chemistry'),array(5,'Department of General Chemistry'),array(6,'Institute of Silicate Materials'));

//a new array to store the data    
$newData = array();

//loop over each value in the data
foreach($data as $d){
    //check if a key exists under the new data for the common value (affiliation)
    if(!isset($newData[$d[1]])){
        //doesn't exist, group under the common value (affiliation)
        $newData[$d[1]] = array(array(),$d[1]);
    }
    //add the author under it affiliation
    $newData[$d[1]][0][] = $d[0];
}

//get the values from the new data, this resets the keys
$newData = array_values($newData);

//display the data
echo '<pre>'.print_r($newData,1).'</pre>';

пример

приводит к:

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

            [1] => Department of General Chemistry
        )

    [1] => Array
        (
            [0] => Array
                (
                    [0] => 3
                    [1] => 6
                )

            [1] => Institute of Silicate Materials
        )

)

Ответ 3

Попробуйте этот код, он должен решить вашу проблему:

<?php
$element = array ( 
    array ( 
            2 
            ,'Department of General Chemistry'
        ) ,
    array ( 
            3, 
            'Institute of Silicate Materials'
        ), 
    array ( 
            4 
            , 'Department of General Chemistry'
        ) ,
    array ( 
            5 
            , 'Department of General Chemistry'
        ) ,
    array ( 
            6 
            , 'Institute of Silicate Materials'
        ) 
);

$res = array();

for($i=0; $i< count($element); $i++){
    $res[$element[$i][1]][] =  $element[$i][0];
}

echo '<pre>';
    var_dump($res);
echo '</pre>';

foreach ($res as $key => $value){
    echo $key .' : '. implode(',',$value). '<br>';
}
?>

Ответ 4

Вы можете сделать это следующим образом:

$ar = array ( 
    array( 
        2,
        'Department of General Chemistry'
    ),
    array( 
        3,
        'Institute of Silicate Materials'
    ),
    array( 
        4,
        'Department of General Chemistry'
    ),
    array( 
        5,
        'Department of General Chemistry'
    ), 
    array( 
        6,
        'Institute of Silicate Materials'
    )
);

$result = array();
foreach ($ar as $key => $value) {
    if (array_key_exists($value[1], $result)) {
        $result[$value[1]] .= ',' . $value[0];
    } else {
        $result[$value[1]] = $value[0];
    }
}

foreach ($result as $key => $value) {
    echo $value . ' ' . $key . '<br>';
}