Tuşu ile çok boyutlu diziye Sıralama diziler

3 Cevap php

Bana aşağıdaki sonucu verir bir veritabanı tablo var:

array(8) {
    ["link_id"]=>
    string(2) "20"
    ["link_url"]=>
    string(56) "http://url.of/website"
    ["link_name"]=>
    string(34) "Website title"
    ["link_target"]=>
    string(0) ""
    ["link_description"]=>
    string(0) ""
    ["link_updated"]=>
    string(19) "2009-05-24 16:51:04"
    ["taxonomy_id"]=>
    string(2) "36"
    ["term_id"]=>
    string(2) "34"
    ["category_name"]=>
    string(15) "Link category"
}

Ben link_updated anahtar sıralanması sonra bir çok boyutlu category_name anahtarına dayalı dizi, ve bu dizilerin çoğu sıralamak istiyorum.

Yani sonuçta bu gibi bakmak istiyorum:

array(2) {
    ["First category"]=>
    array(2) {
        ["link_name"]=>
        string(11) "Newest link"
        ["link_updated"]=>
        string(19) "2009-05-24 16:51:24"
    }
    ["Second category"]=>
    array(2) {
        ["link_name"]=>
        string(10) "Older link"
        ["link_updated"]=>
        string(19) "2009-05-20 05:32:56"
    }
}

Ben bunu nasıl hiçbir fikrim yok, ama ben kendi sıralama yöntemini (usort ()) yapmak zorunda düşünüyorum?

EDIT: Ben her kategoride 5 bağlantıları göstermek istiyorum.

3 Cevap

Ben aşağıdaki kodu kullanarak, kendim çözüldü:

foreach ($bookmarks as $b)
{
    $category[$b["category_name"]][] = array(
        "link_id" => $b["link_id"],
        "link_url" => $b["link_url"],
        "link_name" => $b["link_name"],
        "link_target" => $b["link_target"],
        "link_description" => $b["link_description"],
        "link_updated" => $b["link_updated"],
        "taxonomy_id" => $b["taxonomy_id"],
        "term_id" => $b["term_id"],
        "category_name" => $b["category_name"]
    );
}

Bu kategori adının bir dizi oluşturur ve (kategoriye göre) sağ ana dizideki tüm Altdizilim koyar. Bağlantı güncellenir süre sonra sıralama SQL sorgusunda yapılıyor.

usort() istediğiniz herhangi bir şekilde dizileri sıralamak yapabilirsiniz:

function sort_crazy_way($a, $b){
  // do your business.
}

usort($array, 'sort_crazy_way');

Eğer bu sıralama olsun sonra, döngü için başka son dizi oluşturabilirsiniz.

PHP manuel:

The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.

Yani, karşılaştırma işlevi gibi bir şey olmalıdır:

function sort_crazy_way($a, $b){
  $sorted_by_category = strcmp($a['category_name'], $b['category_name']);
  if($sorted_by_category){
    return $sorted_by_category;
  }

  // If we're here, category_name is the same. Compare link_updated.

  $time_diff = strtotime($a['link_updated']) - strtotime($b['link_updated']);
  return $time_diff;
}

array_multisort burada hile yapmak gerekir - oldukça güçlü.