Anahtar değeri tarafından PHP nesnelerin bir dizi bir dizi sıralama

5 Cevap php

Temelde ben aşağıdaki gibi bir kurulum var:

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 )
              )
  )

Neye ihtiyacım Nesne [değer] tuşu ile ana dizinin içindeki tüm diziler sıralamak için bir yoldur. Ben usort ve farklı yöntemler ile şimdi yaklaşık 2 gündür çalışıyorum ama sadece etrafında başımı almak için görünmüyor olabilir. (: 0 aşağı 100 IE) [değer] tuşuna 0'dan 100'e kadar her yerde değişecektir ve azalan sıralanır dizileri her gerekiyor.

5 Cevap

Kullan 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');

Bunu yapmanın bir yolu, iki dizileri oluştururken, böylece nesneler diziden değer dizi ayırmak ve etmektir. Daha sonra diğer diziye göre nesneler dizisini sıralamak için array_multisort kullanabilirsiniz. İşte bir örnek:

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

Loop dizi bir kez bir foreach kullanmak ve gelen [değer] tuşu ile yeni bir dizi oluşturabilirsiniz:

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

Bu nesnesinin değerini almak ve MULTISORT kullanabileceğiniz başka diziye ekleyecektir.

Sonunda, kod bu gibi görünecektir:

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

Array_multisort alanında ilk dizi sizin ikinci dizi sıralamak için kullandığınız dizi olmalıdır.

Ayrıca bu diğer sıralama yöntemini ekleyebilirsiniz. Bunları buradan okuyabilirsiniz: link text

function cmp($a, $b) {
    return $b->value - $a->value;
}

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

Basit bir değerin veya anahtarın başka bir şey dayalı bir diziyi sıralamak için, usort işlevini kullanmak ve kendi karşılaştırma sağlamanız gerekir. Karşılaştırma fonksiyonları [(1)] $a $b önce gelirse $b {önce gelirse, pozitif bir değer döndü ve negatif biridir şekilde tanımlanmış olmalıdır } (veya sıfır eşit iseler). Eğer sayı değerlere dayalı karşılaştırma ve bir ters sıralama, bunu yapmanın basit bir şekilde istediğiniz gibi değerinden $a in 'değer' çıkarmak için $b.

Ben yanlış olabilir, ama ben asort kullanarak böyle bir şey () (veya asort ()) yaptım inanıyorum. Ben endeksleri ve zaman damgaları ile dolu iki boyutlu bir dizi sıralamak için gerekli nerede, bir arama işlevi oldu.

Ben sizin durumda çalışacaktır eğer emin değilim, ve ben uzun zaman önce yaptım. Belki de, olsa iyi şanslar başlamak olacaktır.

100% stolen from the 1st answer on this page. http://us.php.net/manual/en/function.array-multisort.php
But this is what I was looking for.

Nesneler bir dizi MULTISORT:

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
         )

   )
)