Tuşu ile o değere göre - PHP dizi birden fazla sıralama?

8 Cevap php

Ben bu nedenle, her etiketin olaylarda sayısı ile etiketleri listesinde kullanmak için sayısal değerleri ile dize anahtarları bir dizi var:

$arrTags['mango'] = 2; 
$arrTags['orange'] = 4; 
$arrTags['apple'] = 2; 
$arrTags['banana'] = 3;

Bu yüzden, böylece bir oluşumu azalan etiket listesini görüntüleyebilirsiniz olduğunu:

orange (4)  
banana (3) 
mango (2) 
apple (2)

i arsort parlak ama ben de alfabetik sıralanmasını aynı sayısal değere sahip herhangi bir etiket istediğiniz değere göre sıralamak ters, yani nihai sonucu olabilir kullanabilirsiniz:

orange (4)  
banana (3) 
apple (2) 
mango (2)

ben bunu bir yolu var mı? I usort gitmek için yol olduğunu tahmin ediyorum ama php.net üzerinde örneklere bakmak ve gözlerimi üzerinde sır! çok teşekkürler!

8 Cevap

Have a look at examples #3: http://uk.php.net/manual/en/function.array-multisort.php

Sen indeksler olarak kullanmak için iki diziyi oluşturmanız gerekir; bir orijinal dizinin tuşları ve orijinal dizinin değerlerinin diğer oluşur.

Ardından sayısal değerlere (orijinal dizinin değerleri) göre daha sonra metin değerlerini (orijinal dizinin anahtarları) göre sıralamak için MULTISORT kullanmak.

Scott Saunders David'in çözümüne yaptığı açıklamada ipuçları gibi, döngü kurtulmak için array_keys () ve array_values ​​() fonksiyonlarını kullanabilirsiniz. Aslında, tek bir kod satırında bu çözebilir:

array_multisort(array_values($arrTags), SORT_DESC, array_keys($arrTags), SORT_ASC, $arrTags);

SOLVED

Biraz deneme sonra array_multisort güzel hile yok olduğunu keşfetti:

$tag = array(); 
$num = array();

foreach($arrTags as $key => $value){ 
$tag[] = $key; 
$num[] = $value; 
}

array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags);

:)

Sen çok karmaşık düşünüyorsun:

ksort($arrTags);
arsort($arrTags);

Siz istediğiniz gibi Şimdi dizisi sıralanır.

SlappyTheFish doğru yeniden bir: ksort, arsort vs array_multisort kullanarak

David'in örnek ksort yılında arsort tuşun dize değerleri alfabetik karakterler dışındaki karakterleri içeriyorsa amaçlandığı gibi, ancak sıralama çalışmayabilir, gayet iyi çalışıyor.

ex:

$arrTags['banana'] = 3;
$arrTags['mango'] = 2;
$arrTags['apple1'] = 2;
$arrTags['orange'] = 4;
$arrTags['almond1'] = 2;

ksort($arrTags);
arsort($arrTags);

print_r($arrTags);

döner:

Array
(
    [orange] => 4
    [banana] => 3
    [apple1] => 2
    [mango] => 2
    [almond1] => 2
)

Ancak kullanarak:

$arrTags['banana'] = 3;
$arrTags['mango'] = 2;
$arrTags['apple1'] = 2;
$arrTags['orange'] = 4;
$arrTags['almond1'] = 2;

$tag = array();
$num = array();

foreach($arrTags as $key => $value){
    $tag[] = $key;
    $num[] = $value;
}

array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags);


print_r($arrTags);

döner:

Array
(
    [orange] => 4
    [banana] => 3
    [almond1] => 2
    [apple1] => 2
    [mango] => 2
)

Önceki önerilen çözüm mantıklı görünüyor, ama sadece iş doens't:

ksort($arrTags);
arsort($arrTags);

Diye sordu sıralamayı gerçekleştirmek için eksiksiz bir PHP kodu olacak:

$k = array_keys($arrTags);
$v = array_values($arrTags);
array_multisort($k, SORT_ASC, $v, SORT_DESC);
$arrTags = array_combine($k, $v);

Bu array_multisort () kullanıcı girişi başvuruları kullanan unutmayın, bu yüzden iki geçici variabels ($ k ve $ v) kullanıcı girişi gibi içerik sağlamak için kullanmak zorunda duyarız. Bu şekilde array_multisort () içeriğini değiştirebilirsiniz. Daha sonra, array_combine yoluyla sınıflandırılmaktadır dizi (yeniden).

Bu görevi gerçekleştirmek için bir yeniden işlev inşa ettik:

<?php
/**
 * Sort a multi-dimensional array by key, then by value.
 *
 * @param array Array to be sorted
 * @param int One of the available sort options: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING
 * @param int One of the available sort options: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING
 * @return void
 * @example The following array will be reordered:
 *  $a = array(
 *      'd' => 4,
 *      'c' => 2,
 *      'a' => 3,
 *      'b' => 1,
 *      'e' => 2,
 *      'g' => 2,
 *      'f' => 2,
 *  );
 *  SortArrayByKeyThanValue($a);        # reorder array to: array(
 *      'b' => 1,
 *      'c' => 2,
 *      'e' => 2,
 *      'f' => 2,
 *      'g' => 2,
 *      'a' => 3,
 *      'd' => 4,
 *  );
 * @author Sijmen Ruwhof <sijmen(a)secundity.com>
 * @copyright 2011, Secundity
 */
function SortArrayByKeyThanValue (&$pArray, $pSortMethodForKey = SORT_ASC, $pSortMethodForValue = SORT_ASC)
{
    # check user input: sorting is not necessary
    if (count($pArray) < 2)
        return;

    # define $k and $v as array_multisort() needs real variables, as user input is put by reference
    $k = array_keys  ($pArray);
    $v = array_values($pArray);

    array_multisort(
        $v, $pSortMethodForValue,
        $k, $pSortMethodForKey
    );
    $pArray = array_combine($k, $v);
}
?>

Ben denedim değil, ancak daha sonra inen değerleri sıralama, ilk artan sıralama tuşları denedi?

Bu zaten aynı iseniz en sıralar etrafında unsurları taşımak olmayacak gibi görünüyor.

Sadece karşılaştırmalar dayalı sırayla boş bir dizi oluşturmak ve bunları eklemek için bir işlev oluşturabilirsiniz.