2014-01-23 3 views
2

У меня есть массив, который мне нужно отсортировать, я отправлю пример для лучшего понимания. Это мой несортированный массив:PHP - Нестандартная сортировка массива

[0] => Array 
    (
     [title] => This is some title 
     [catid] => 1 
    )  
[1] => Array 
    (
     [title] => This is some title 
     [catid] => 1 
    ) 
[2] => Array 
    (
     [title] => This is some title 
     [catid] => 2 
    )  
[3] => Array 
    (
     [title] => This is some title 
     [catid] => 2 
    ) 

мне нужно пересортируйте это так:

[0] => Array 
    (
     [title] => This is some title 
     [catid] => 1 
    )  
[1] => Array 
    (
     [title] => This is some title 
     [catid] => 2 
    ) 
[2] => Array 
    (
     [title] => This is some title 
     [catid] => 1 
    )  
[3] => Array 
    (
     [title] => This is some title 
     [catid] => 2 
    ) 

меня будет больше, что две категории, и мне нужно выбрать один элемент в каждой категории, так что если у меня есть 3 категории, мой CatID в этом случае будет сортироваться так:

CatID: 1, 2, 3, 1, 2, 3

Спасибо

+1

мог ли когда-нибудь 1,2,3,1,3? –

+1

... или 1,2,3,1,1,1? –

+1

более точно, что произойдет, если нет четкой линейки 1,2,3, например, 5 1, 2 2 1 3 или что-то –

ответ

4

Вот мое взятие:

/** just generating some data, not part of script **/ 
$originalArray = array(); 
$title = range('a','z'); 
for ($x=0;$x<20;$x++) { 
    shuffle($title); 
    $originalArray[] = array(
    'title' => implode(array_slice($title,0,rand(4,9))), 
    'catid' => rand(1,3) 
); 
} 
/** end generating data **/ 


$tempArray = array(); 
foreach ($originalArray as $array) { 
    $tempArray[$array['catid']][] = $array['title']; 
} 
ksort($tempArray); 

$newArray = array(); 
while (count($tempArray)>0) { 
    foreach ($tempArray as $mKey => &$mArray) { 
    if (count($mArray)>0) 
     $newArray[] = array('title'=>array_shift($mArray),'catid'=>$mKey); 
    } 
    $tempArray = array_filter($tempArray); 
} 
+0

'+ 1' @crayonviolent Отличный ответ! Дорога более элегантная, чем моя. lol –

+0

Отлично! Это то что мне нужно! – luka

2

Это то, что я придумал для 1-мерного массива, но он должен работать и на 2d.

$array = [1, 2, 2, 1, 3, 2, 3, 2, 1]; 

sort($array); 

$newarray; 


do{ 
    $max= max($array); 
    for($a = 0; $a <= $max; $a++){ 
     foreach($array as $key => $value){ 
      if($value == $a){ 
       $newarray[] = $value; 
       unset($array[$key]); 
       break; 
      } 
     } 
    } 

}while(!empty($array)); 

Это

1, 2, 2, 1, 3, 2, 3, 2, 1 

стал бы:

1, 2, 3, 1, 2, 3, 1, 2, 2 
Смежные вопросы