3

この質問は、 「この質問」からのフォローアップ質問です。codeigniter コードは、データベース レコードセットを次の配列として返します。

Array
(
    [0] => stdClass Object
    (
        [user_id] => NLK32439
        [first_name] => sdn
        [last_name] => hf]zL
        [email_address] => user1@hotmail.com
        [mobile_number] => 9841349349
        [description] => g]kfn
        [date_joined] => 09-AUG-12
        [status] => 1
        [username] => user1
        [userpassword] => 691f9298642af07c2d6ea8fef56074201e077b34
    )

    [1] => stdClass Object
    (
        [user_id] => NLK94358
        [first_name] => alag
        [last_name] => k|wfg
        [email_address] => user2@gmail.com
        [mobile_number] => 823472384723
        [description] => g]kfn
        [date_joined] => 09-AUG-12
        [status] => 1
        [username] => user2
        [userpassword] => 691f9298642af07c2d6ea8fef56074201e077b34
    )

    [2] => stdClass Object
    (
        [user_id] => NLK32437
        [first_name] => ;lag
        [last_name] => %]qL
        [email_address] => user3@msn.com
        [mobile_number] => 9851112412
        [description] => g]kfn
        [date_joined] => 08-AUG-12
        [status] => 1
        [username] => user3
        [userpassword] => 691f9298642af07c2d6ea8fef56074201e077b34
    )

    [3] => stdClass Object
    (
        [user_id] => NLK32435
        [first_name] => clgn
        [last_name] => zdf{
        [email_address] => user4@msn.com
        [mobile_number] => 984134354
        [description] => g]kfn
        [date_joined] => 08-AUG-12
        [status] => 1
        [username] => user4
        [userpassword] => 0e025eade868b4b481f41ff7449bc1967261e170
    )

)

私がやりたいのは、特定の条件に基づいて「first_name」で配列をソートすることだけです。これまでの私のphpコードは-

<?php
usort($array, function ($a, $b) {
    static $order = array('c', 's','a',';', 'L');
    return array_search($a->first_name, $order) - array_search($b->first_name, $order);
});
?>

私の意図は、'c' で始まる first_name が 1 番目、's' が 2 番目、'a' が 3 番目、';' が来るように配列をソートすることです。4番目に来ます。

しかし、上記のコードは期待どおりに機能しません。シーケンスでレコードを返しています:

's','a',';','c'

シーケンスで返されるはずです

'c', 's','a',';'

私はカスタム Devnagari フォントを使用しているため、キーボードの各アルファベットは Devnagari の特定の文字を表しています。したがって、デヴナガリでは、c が最初に来て、s が 2 番目に続きます。

どんな助けでも大歓迎です。前もって感謝します

4

1 に答える 1

1

これは、array_search を使用すると、文字列が配列内の文字列と完全に一致する場合にのみ返されるためです。

$array = array('a','b','c');
var_dump(array_search('blue',$array))
// This will output
bool(false)

したがって、必要に応じてこれを試すことができます:

<?php
usort($array, function ($a, $b) {
static $order = array('c', 's','a',';', 'L');
return array_search(substr($a->first_name,0,1), $order) - array_search(substr($b->first_name,0,1), $order);
});
?>

お役に立てれば。

更新:あなたのコメントに対するあなたの質問について、私には考えがあります。ご覧ください。

usort($array, function($a, $b) {
    //example for the orders
    static $orders = array (';l', 'c', 's', 'a', ';', 'L');

    //variables to count the point for $a and $b (it is equal at first)
    $pointA = 1;
    $pointB = 1;

    //also variables to mark if $a or $b are matched on one of the orders
    $isFoundA = false;
    $isFoundB = false;

    //iterate foreach orders
    $i = 0; //this is something to add to the point, the more earlier the first_name found in the order, the less point will be added
    foreach ($orders as $order) {
        //if $a->first_name is still not found in orders and it has been just founded 
        if (!$isFoundA && strpos($a->first_name,$order) === 0) {
            $pointA += $i;
            $isFoundA = true; //we don't need to check this again since we had found it
        }
        //if $b->first_name is still not found in orders and it has been just founded 
        if (!isFoundB && strpos($b->first_name,$order) === 0) {
            $pointB += $i;
            $isFoundB = true; //the same as above, we don't need to check it again
        }
        $i++;
    }
    //after iterate in orders, we check the points for $a and $b
    if ($pointA == $pointB) return 0;
    else return ($pointA < $pointB) ? -1 : 1;
});

現在、注文には文字の制限がありません。次のようなものを指定できますstatic $orders = array('abc','a',';');またはstatic $orders = array('abcdef', 'b', 'z', ';', 'c[');それがうまくいくかどうか教えてください。

于 2012-08-09T09:49:22.127 に答える