Zor dizi sıralama düzeni

3 Cevap php

Ben böyle bir dizi var:

array(
    0 => array("src" => "foo-21.gif"),
    1 => array("src" => "bar-short.gif"), 
    2 => array("src" => "baz-1.gif"), 
    3 => array("src" => "whatever.gif"), 
    4 => array("src" => "some-long.gif"), 
    5 => array("src" => "xyz.gif"), 
);

src elemanına değer bir şey olabilir.

Ancak sadece maksimum olacaktır. içeren bir eleman short ve sadece max (burada element 1). içeren bir Elment long (burada eleman 4'tür). Onlar dizide herhangi bir yerde olabilir. Ya da hiç mevcut değildir.

Şimdi ne yapmam gerek:

  • src içeren elemanı short İlk olmalıdır mevcut
  • Conaining elemanı long son olmalıdır mevcut
  • Arasında sırası önemli değildir.

Yani örnek şöyle olacaktır:

array(
    0 => array("src" => "bar-short.gif"), // containing "short" = first
    1 => array("src" => "foo-21.gif"), 
    2 => array("src" => "baz-1.gif"), 
    3 => array("src" => "whatever.gif"), 
    4 => array("src" => "xyz.gif"), 
    5 => array("src" => "some-long.gif"), // containing "long" = last
);

Bunu nasıl yaparım? usort burada iyi bir fikir gibi görünmüyor.

3 Cevap

Dizinizi varsayarak $list:

function short_long_sort($a, $b)
{
    $short_str = '-short';
    $long_str = '-long';
    if (strpos($a['src'], $short_str)) return -1;
    if (strpos($b['src'], $short_str)) return 1;
    if (strpos($a['src'], $long_str)) return 1;
    if (strpos($b['src'], $long_str)) return -1;
    return 0;
}

usort($list, 'short_long_sort');
print_r($list);

usort() aslında burada sadece iyi işe yarayabilir; return -1 ilk argüman "kısa" ve / veya ikinci argüman, "uzun" olan, 1 (gerçekten ya da bir şey) ya da tam tersi, ve 0 durumda ne if varsa.

Sadece unsurlar "kısa" ve "uzun" hangi izlemek Alternatif olarak, eğer bir şey sıralamak gerekmez girişi yaptığınızda bunları, daha sonra örn:

process($arr->[$short]);
for ($i=0; $i < @$arr; $i++) {
  process($arr->[$i]) if (($i != $short) && ($i != $long));
}
process($arr->[$long]);