Çok boyutlu dizi değeri PHP sıralama

4 Cevap php

Ben çok boyutlu bir dizi olarak tablo hakkında bilgi, gerçek alan adı ve açıklayıcı alan adı ile veritabanı alanları bir dizi ile bir dizi bina duyuyorum. İşte o anda neye benzediğini:

$Fields['User']['ID'] = "User ID";
$Fields['User']['FirstName'] = "First Name";
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered";
$Fields['Geographic']['Location'] = "Current Location";
$Fields['Geographic']['LocationCode'] = "Current Location Code";

Tamam, bu iyi, ama ben seçilmiş alanlarda ihracat sağlayan bir sistem içine bu boru ediyorum ve sonunda ben, farklı düzeylerde () foreach veri ayıklamak ve sonuçta görüntülenecek bütün açıklayıcı alanlar olmasını istiyorsanız kendi açıklayıcı adını kullanarak alfabetik olarak sıralanmış. Yani sonuçta sırayla: Current Location, Current Location Code, Favorite Item Ordered, First Name then User ID - Açıkçası endeksi dernekler tutuyor.

Ben usort kullanamazsınız () ve () array_multisort kullanamazsınız ... ya da belki ben ve ne kadar bilmiyorum. usort () sıralamak için bir anahtar gerekir gibi görünüyor, ama değişken tuşları var. array_multisort () sadece gerçekten () olarak sıralama aynı yapmak gibi görünüyor.

4 Cevap

Bu yalnızca 2B dizi içindir. Ben değil yazdım, ama çalışıyor kod en şık parçası ...

    foreach($Fields as $key=>$var) {
        ksort($var);
        $Fields[$key]=$var;
    }
    ksort($Fields);

Sahte verilerin aksine sahte verilerin neredeyse beni karıştı çünkü beni oldukça, gerçek hayat verileri örnek vereyim. Yani, sahte veri yorumladı edilir.

/*
$Fields['User']['ID'] = "User ID";
$Fields['User']['FirstName'] = "First Name";
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered";
$Fields['Geographic']['Location'] = "Current Location";
$Fields['Geographic']['LocationCode'] = "Current Location Code";
*/

$Fields['Product']['ReferenceNumber'] = "Product Reference Number";
$Fields['Product']['Halaal'] = "Halaal Status";
$Fields['Product']['Kosher'] = "Kosher Status";
$Fields['Product']['KosherType'] = "Kosher Type";
$Fields['Product']['CuringSalts'] = "Curing Salts Status";
$Fields['Product']['ProductVisibility'] = "Product Visibility";
$Fields['Product']['ProductStatus'] = "Product Status";
$Fields['Product']['PackBarCode'] = "Barcode";
$Fields['Product']['ProductDescription'] = "Product Description";
$Fields['Pack']['PackSize'] = "Pack Size";
$Fields['Pack']['PackSizeNumeric'] = "Numeric Pack Size";
$Fields['Allergens']['ContainsNuts'] = "Product Contains Nuts";


foreach ($Fields as $key => $value) {
    ksort($value);
    $Fields[$key] = $value;
}
ksort($Fields);

Ben 'o' Cuma ... print_r ($ Fields) tuşları sınıflandırılmaktadır ediliyor ve değerler ilişkili olduğunu ortaya koymaktadır birini yaşıyorum, ama yine de bitiş değerini tuşları ile sıralama ve değil.

I, önce tüm değerleri denetler onları sıralar ve daha sonra 'tamam nereye ah sen Tablo Y FieldX ait ... ait etmeyin' diyor bir ters sıralama sistemine ihtiyaç neredeyse gibi

Ben belki de var, bunu yapmak için bir sinsi akıllı yolu olduğunu umuyordum, ama ben, veri ayrıştırmak bir ters dizi yazmak ve sonra değer-sırayla orijinali yeniden yazmak için bir fonksiyon yazacağım sanırım. Hectically verimsiz, ama yapacağız.

Yine olsa daha iyi önerilere açık!

Ben tam anlamıyla üzerinde çalıştığım bir proje için dün bu işe vardı - benim kod:

Kaynak dizi bu gibi görünüyor:

$resource[$count]['title']
$resource[$count]['filepath']
$resource[$count]['filename']
$resource[$count]['taxonomy'][0]

Başlık ASC veya DESC göre sıralamak için sıralama işlevleri bir çift

function compare_asc($a, $b) {
    return strcmp($a['title'], $b['title']);
}
function compare_desc($a, $b) {
    if ($a['title'] == $b['title']) {
        return 0;
    }
    return ($a['title'] > $b['title']) ? -1 : 1;
    //return strcmp($a['title'], $b['title']);
}

Ve nihayet $ kaynak ve ihtiyacınız ne olursa olsun çıkış aracılığıyla size döngü önce kirli yapmak için usort kullanın.

usort($resource, "compare_asc");

Tamam, hiç şık değil. Yani bu kullanarak teşvik etmiyoruz ve satır aşağı daha iyi bir yol arar. Ama burada yukarıda ve aşağıda örneklerle çalışır elimdeki çözümdür.

Ne yazık ki, ben olmak istiyorum yolu, dizi yani bir önceki 'sipariş' numarasını içeren HAS, ben bir başından itibaren benim açımdan başarısız olduğunu varsayalım. Ama şimdi çalışıyor.

$TempDescArray = array();
$TempFieldArray = array();
$TempTableArray = array();
$Pointer = 0;

foreach ($Fields as $Table => $FieldsArray) {   
    foreach ($FieldsArray as $Field => $Description) {
        $TempDescArray[$Pointer] = $Description;
        $TempFieldArray[$Pointer] = $Field;
        $TempTableArray[$Pointer] = $Table;
        $Pointer++;
    }
}

asort($TempDescArray);
$Fields = array();
$Pointer2 = 0;

foreach ($TempDescArray as $Pointer => $Description) {
    $Fields[$Pointer2][$TempTableArray[$Pointer]][$TempFieldArray[$Pointer]] = $Description;
    $Pointer2++;
}