※ 引述《dowbatw (Dowbatw)》之銘言:
: 如蒙解惑,不勝感激!
你的資料應該很難純以排序來處理,
因為元素彼此之間不是只有次序,還有從屬關係,
所謂一般性的排序指的是「拿起兩個元素依某個規則判斷次序,然後調整其位置」
如果你的資料無法在兩個元素之間有絕對性的次序判斷,
就不太有辦法純以排序來解。
回歸正題,我寫了一個相鄰排序的解,可以解你給的資料
(因為你的資料正好是相鄰可排序的特例)
比較函式:
function cmpare ($a, $b) {
$ab = isset ($a['belong']);
$bb = isset ($b['belong']);
// (! $ab && $bb) || (! $ab && ! $bb)
if (! $ab)
return 0;
else if ($ab && ! $bb)
return 1;
// $ab && $bb
else {
if ($a['belong'] == $b['belong'])
return $a['order'] < $b['order'] ? 0 : 1;
else if ($b['label'] == $a['belong'])
return 1;
return 0;
}
}
假設你給的資料陣列變數是 $set,以 compare 做排序:
$set = array_values ($set);
$size = count ($set);
$new = Array ();
for ($i=0; $i<$size; $i++) {
if (isset ($set[$i + 1]) && cmpare ($set[$i], $set[$i + 1])) {
$tmp = $set[$i];
$set[$i] = $set[$i + 1];
$set[$i + 1] = $tmp;
}
$new[$set[$i]['label']] = $set[$i];
}
輸出:
var_dump ($new);
如我一開始所說,這是特例解,
假設你的資料不在此「相鄰可排序」的特例範圍內就要另外再做處理了…
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.249.65
→
01/01 02:19, , 1F
01/01 02:19, 1F
推
01/01 13:41, , 2F
01/01 13:41, 2F
→
01/01 13:42, , 3F
01/01 13:42, 3F
→
01/01 13:42, , 4F
01/01 13:42, 4F
→
01/01 14:33, , 5F
01/01 14:33, 5F
討論串 (同標題文章)