0

ユーザーのステータスに基づいて DB アレイをマルチソートしようとしています。Status = 1 のものは配列の一番上に、Status = 0 のものは一番下に移動します。私はそれが機能していると思っていましたが、今日、DBに新しい行が追加されて停止しました.

uasort($ven, function ($a, $b) { return $a['v_status'] == '1' ? false : true; });

これは、MySQL の単純な DB 配列です。

Array (
 [0] => array(
   [name] => '',
   [v_status] => 0
 [1] => array(
   [name] => '',
   [v_status] => 1
)
4

2 に答える 2

1

私の他の回答へのコメントで述べたように、配列をアクティブ/非アクティブ配列に分割することは、並べ替えよりも優れたソリューションになる可能性があります。

$items = array(
    array('name' => 'active1', 'active' => '1'),
    array('name' => 'inactive1', 'active' => '0'),
    array('name' => 'active2', 'active' => '1'),
    array('name' => 'inactive2', 'active' => '0'),
    array('name' => 'inactive3', 'active' => '0'),
    array('name' => 'active3', 'active' => '1'),
    array('name' => 'inactive4', 'active' => '0'),
);

$active = array_filter($items, function($item){ return $item['active'] == '1'; });
echo '<pre>' . print_r($active,true);

// You could filter again here, not sure which would be quicker, 
// but my guess would be the array_diff method (which also ensures
// that no items get filtered out by both filters)
$inactive = array_diff_key($items, $active);
echo '<pre>' . print_r($inactive,true);
于 2013-09-03T09:13:25.350 に答える
0

uasort は、コールバックが $a が $b より上にある場合は正の整数を返し、$b が $a より上にある場合は負の整数を返し、それらが等しい場合は 0 を返すことを期待します。

これが、2 つのオプションしかないにもかかわらず、Jon の提案return $b['v_status'] - $a['v_status'];が正しい理由です。

あなたの場合、ソート中のある時点で $a[v_status] = 0 および $b[v_status] = 1 の場合、関数は $a[v_status] を見て、false を返します。これは 0 とアルゴリズム (クイック ソートだと思います) はそれらを等しいものとして扱い、現在の順序のままにします。

PHP: usortを参照してください。同様のコールバックが必要です。

于 2013-08-28T23:42:13.090 に答える