Bir kayıt dizinin JENERİK sıralama için gerekli PHP 5.2 Fonksiyon

3 Cevap php

Birileri artık buna bir çözüm ile gelmiş olmalıdır. Biz PHP 5.2 kullanıyor. (Neden bana sormayın.) Ben bir HTML tablosu / datagrid gibi bir kayıt görüntülemek için bir PHP sınıfı yazdım, ve ben biz kullanıcının seçtiği hangisi sütun ile DataGrid sıralamak böylece genişletmek istiyoruz. Aşağıdaki örnek veriler, biz Adı, Gömlek, atama veya Yaş alanlar tarafından kayıt dizisi sıralamak gerekebilir. Ben ekran kısmının ilgilenir, ben sadece veri dizisi sıralama ile yardıma ihtiyacım var.

Her zamanki gibi, ben, bir sonuç almak o neden düşünce yineleme ve bir assciateiave diziye kayıtları koymak için bir veritabanını sorgulamak. Yani, biz diziler ile sonuna kadar. (Aşağıya bakınız.) Ben kümesi içinde herhangi bir sütuna göre sıralamak gerekiyor. Ancak, tasarım zamanında sütun adlarını bilmiyorum, ne de kolonlarını dize veya sayısal değerler olacak eğer ben bileceğim.

Bu çözümler bir ton gördük, ama ben bir İYİ ve genel çözüm görmedim biri ben JENERİK olan kayıt dizisi sıralayabilirsiniz bir yol önerebilir misiniz, ve herhangi bir kayıt üzerinde çalışacak? Yine, tasarım zamanında alanların adlarını veya veritiplerini bilemezsiniz. Aşağıda sunulan dizinin sadece bir örneğidir.

GÜNCELLEME: Evet, ben veritabanı sıralama yapmak isterdim, ama bu sadece ne olacak değil. Biz çalışan sorguları çok karmaşıktır. (Ben gerçekten Star Trek karakterleri bir tablo sorgulama değilim.) Onlar katılır sınırlarını ve karmaşık hükümler içermektedir. ORDER BY eklemek için SQL deyimini çürütmek için bir işlev yazma gerçekten bir seçenek değildir. Ayrıca, bazen biz zaten sorguda bir sonucudur dizi, yerine yeni bir sorgu çalıştırmak için yeteneği var.

Array
(
    [0] => Array
        (
            [name] => Kirk
            [shrit] => Gold
            [assign] => Bridge
        )

    [1] => Array
        (
            [name] => Spock
            [shrit] => Blue
            [assign] => Bridge
        )

    [2] => Array
        (
            [name] => Uhura
            [shrit] => Red
            [assign] => Bridge
        )

    [3] => Array
        (
            [name] => Scotty
            [shrit] => Red
            [assign] => Engineering
        )

    [4] => Array
        (
            [name] => McCoy
            [shrit] => Blue
            [assign] => Sick Bay
        )

)

3 Cevap

Peki, ilk kapalı, sen (daha verimli) veritabanında sıralama yapılmalıdır. Değilse

Php 5.3 + In:

function getSortCommand($field, $sortfunc) {
    return function($var1, $var2) use ($field, $sortfunc) {
        return $sortfunc($var1[$field], $var2[$field]);
    }
}

php <= 5.2, saf bir işlevi oluşturmak gerekir:

function getSortCommand($field, $sortfunc) {
    return create_function('$var1, $var2', 'return '.$sortfunc.'($var1["'.$field.'"], $var2["'.$field.'"]);');
}

Her ikisi için Kullanımı:

$array = usort($array, getSortCommand('name', 'strnatcasecmp'));

Alanını ayarlamak için, sadece $ alan parametreyi değiştirin. Sıralama işlevi değiştirmek için, sadece $ sortfunc parametreyi değiştirmek ...

Ben veritabanında bunu öneririm. Aksi takdirde, bu kullanabilirsiniz:

function sortby(&$arr, $column) {
    usort($arr,
        function ($a, $b) use ($column) {
            return strcmp($a[$column], $b[$column]);
        }
    );
}

Veritabanı sorgulama yaparken kesinlikle sıralama yapmak gerekir.

Sen ?orderby=name&dir=asc <TH> s gibi bir link ekleyerek bunu

Sonra varlığını kontrol veritabanını sorgulamak zaman $_GET['orderby']. Varsa yan tümcesi ile sipariş ekleyin.

Bir clientside seçeneği http://tablesorter.com/docs/ olduğunu