Birden çok kez aynı dizide array_multisort kullanıyorsunuz?

1 Cevap php

Benim veritabanında (~ 1500 satırlar, 10-15 alanlar ile her biri) çekti veri büyücek bir tablo var ve ben filtre bir dizi yapıyor ve bazı istatistikleri üreten ve indirmek için kullanıcı için bir excel elektronik tablo bu depolama ediyorum.

(BY WHERE ve ORDER) sadece küçük değişiklikler ile tekrar aynı oldukça komplike sorgusu ile veritabanı vurmak yerine, ben büyük bir diziye sonuçları koyarak ve ardından {[kullanarak, DB bir yolculuk yapıyorum (0)]} ve array_multisort verilerin benim yeni görüşlerini almak için.

I array_multisort yeniyim yüzden ben eleştirisi için burada ne yaptık göndeririz.

// an numerical array of associative arrays
$records = $dbResult->convertToArray();

$fields = $dbResult->getFieldNames();

// this is run once at the start
$sortArr = array();
foreach ($fields as $field) $sortArr[$field] = array();

foreach ($records as $r) {
    foreach ($r as $key => $value) {
        $sortArr[$key][] = $value;
    }
}

// and then to sort:
array_multisort(
    $sortArr['Date Completed'], SORT_DESC,
    $sortArr['Last Name'], SORT_ASC,
    $sortArr['First Name'], SORT_ASC,
    $sortArr['Course'], SORT_ASC,
    $records
);

Bu ilk "başka diziye tüm sonuç kopyalamak", olsa çalışıyor bana garip geliyor. Ben tekrar sıralamak için gerektiğinde sorun oluşur. Ben benim $sortArr $records dizisi ile senkronize kalmak için ihtiyacı his var, ama her tür bozulur sonra söyledi.

Ben bu array_multisort amaçlanan kullanımı olduğunu bile emin değilim, o yüzden burada izlemek yolu kapalı olabilir. Herkes bazı tavsiye veya ipuçları verebilir misiniz? Nasıl yok you tür çok boyutlu diziler?

1 Cevap

İşte gidiş sona erdi budur. Bu PHP kılavuzda usort sayfasındaki yorumlarda martin tarafından yayınlanan bir fonksiyonun biraz değiştirilmiş bir versiyonu bulunuyor.

function arfsort( &$array, $fieldList ){
    if (!is_array($fieldList)) {
        $fieldList = array(array($fieldList, SORT_ASC));
    } else {
        for ($i = 0; $i < count($fieldList); ++$i) {
            if (is_array($fieldList[$i])) {
                if (!isset($fieldList[$i][1])) $fieldList[$i][1] = SORT_ASC;
            } else {
                $fieldList[$i] = array($fieldList[$i], SORT_ASC);
            }
        }
    }
    $GLOBALS['__ARFSORT_LIST__'] = $fieldList;
    usort( $array, 'arfsort_func' );

}

function arfsort_func( $a, $b ){
    foreach( $GLOBALS['__ARFSORT_LIST__'] as $f ) {
        $strc = strcasecmp($b[$f[0]], $a[$f[0]]);
        if ( $strc != 0 ){
            return $strc * (!empty($f[1]) && $f[1] == SORT_DESC ? 1 : -1);
        }
    }
    return 0;
}

Umarım biraz daha sağlam özgün çözümü daha işlevini yaptık. Kullanımı:

arfsort($my2DArray, "id");  // just sort by the id field, ascending
// sort by these lastName then firstName, ascending
arfsort($my2DArray, array("lastName", "firstName"));

arfsort($my2DArray, array(
    array("date", SORT_DESC),    // sort by date DESC
    array("lastName", SORT_ASC), // then by last name ascending
    array("firstName"),          // SORT_ASC is the default
    "middleInitial"              // and you don't need to wrap stuff in an array.
));