作者gpmm (银色)
看板PHP
标题Re: [请益] 请问如何排序?很困难…
时间Sun Jan 1 02:14:52 2012
※ 引述《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
1F:→ gpmm:补充一下,这也是为什麽不能直接 uasort ($set, 'compare') 01/01 02:19
2F:推 dowbatw:谢谢前辈辛劳,经过我shuffle试验,似乎没办法一开始就把 01/01 13:41
3F:→ dowbatw:「最高层级」者移到最左边,可能是因为用bubblesort结果? 01/01 13:42
4F:→ dowbatw:我再试试看 01/01 13:42
5F:→ dowbatw: 更正:左半部 01/01 14:33