6

基本的に、次のようなセットアップがあります。

Array ( 
[0] => Array ( [0] => stdClass Object ( [nid] => 1 [title] => title1 [uid] => 1 [parent] => 0 [weight] => -15 [name] => name1 [value] => 0 )
               [1] => stdClass Object ( [nid] => 2 [title] => title2 [uid] => 1 [parent] => 0 [weight] => -7 [name] => name2 [value] => 100 )
               [2] => stdClass Object ( [nid] => 3 [title] => title3 [uid] => 2 [parent] => 0 [weight] => -1 [name] => name3 [value] => 0 )
               [3] => stdClass Object ( [nid] => 4 [title] => title4 [uid] => 2 [parent] => 0 [weight] => 1 [name] => name4 [value] => 80 )
              )
  )

私が必要としているのは、親配列内のすべての配列をオブジェクトの [value] キーでソートする方法です。usort とさまざまな方法で約2日間試してみましたが、頭が回らないようです。[value] キーの範囲は 0 から 100 の範囲で、すべての配列を降順に並べ替える必要があります (IE: 100 から 0 まで)。

4

5 に答える 5

14

usortを使用します。

function cmp($a, $b) {
  if ($a->value == $b->value) {
    return 0;
  } else {
    return $a->value < $b->value ? 1 : -1; // reverse order
  }
}

usort($arr, 'cmp');
于 2009-01-05T23:36:17.850 に答える
4

このページの最初の回答から 100% 盗まれました。 http://us.php.net/manual/en/function.array-multisort.php
しかし、これは私が探していたものです。

オブジェクトの配列のマルチソート:

example object [$object with array of objects]: (class: test) 
---------------------------------- 

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [1] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [2] => test Object (
            [id] => 3
            [title] => DDDD
         )
      [3] => test Object (
            [id] => 4
            [title] => BBBB
         )
   )
)

---------------------------------- 

Simple PHP function: sort_arr_of_obj()

<?php 
// -------------------------------------- 

/* 
* -------- function arguments -------- 
*   $array ........ array of objects
*   $sortby ....... the object-key to sort by
*   $direction ... 'asc' = ascending
* --------
*/

function sort_arr_of_obj($array, $sortby, $direction='asc') {

    $sortedArr = array();
    $tmp_Array = array();

    foreach($array as $k => $v) {
        $tmp_Array[] = strtolower($v->$sortby);
    }

    if($direction=='asc'){
        asort($tmp_Array);
    }else{
        arsort($tmp_Array);
    }

    foreach($tmp_Array as $k=>$tmp){
        $sortedArr[] = $array[$k];
    }

    return $sortedArr;

}


// -------------------------------------- 
?>

example call: 
---------------------------------- 

<?php 

$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');

?>

example result: $sorted (class: test) 
---------------------------------- 

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [1] => test Object (
            [id] => 4
            [title] => BBBB
         )
      [2] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [3] => test Object (
            [id] => 3
            [title] => DDDD
         )

   )
)
于 2012-12-09T22:31:54.327 に答える
3

これを行う方法は、値の配列をオブジェクトの配列から分離し、2つの配列を作成することです。次に、array_multisortを使用して、他の配列に従ってオブジェクトの配列を並べ替えることができます。次に例を示します。

<?php
$array1 = $objectvalues
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4);
array_multisort($array1, $array2);
?>

foreachを使用して、配列を1回ループし、対応する[value]キーを使用して新しい配列を作成できます。

<?php
foreach( $arraywithobjects as $obj )
{
    $objectvalues[] = $obj->getValue();
}
?>

これにより、オブジェクトの値が取得され、マルチソートで使用できる別の配列に挿入されます。

最終的に、コードは次のようになります。

<?php
foreach( $arraywithobjects as $obj )
{
    $objectvalues[] = $obj->getValue();
}
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4);
array_multisort($objectvalues, $array2);
?>

array_multisortフィールドの最初の配列は、2番目の配列の並べ替えに使用している配列である必要があります。

このために他の並べ替え方法を追加することもできます。あなたはここでそれらを読むことができます:リンクテキスト

于 2009-06-18T14:37:03.770 に答える
1
function cmp($a, $b) {
    return $b->value - $a->value;
}

$ary[0] = usort($ary[0], "cmp");

単純な値またはキー以外に基づいて配列をソートするには、usort関数を使用して独自の比較を提供する必要があります。比較関数は、 の$a前にある場合は正の値が返され、前にある場合は$b負の値が返されるように定義する必要があります(または、等しい場合はゼロ)。数値に基づいて比較していて、逆の並べ替えが必要な場合、これを行う最も簡単な方法は、 の値から の「値」を引くことです。$b$a$a$b

于 2009-01-05T23:39:52.587 に答える
0

私は間違っているかもしれませんが、asort() (または asort()) を使用してこのようなことをしたと思います。それは検索関数にあり、インデックスとタイムスタンプで満たされた 2 次元配列をソートする必要がありました。

あなたの場合にうまくいくかどうかはわかりませんが、私はずっと前にそれをしました。多分それはあなたを始めるでしょう、頑張ってください。

于 2009-01-05T23:36:17.773 に答える