困难的数组排序顺序

时间:2009-11-21 06:23:37

标签: php arrays sorting

我有一个这样的数组:

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元素中的值可以是任何值。

然而,只会有最大值。一个元素包含short(这里是元素1)并且只有最大值。一个包含long的元素(这里是元素4)。它们可以在阵列中的任何位置。或根本不存在。

我现在需要做的是:

  • src包含short的元素必须先出现
  • 具有long的元素必须是最后一个
  • 两者之间的顺序无关紧要。

所以这个例子看起来像这样:

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
);

我该怎么做? usort在这里似乎不是一个好主意。

3 个答案:

答案 0 :(得分:2)

usort()实际上可以在这里工作得很好;如果第一个参数有“short”和/或第二个参数有“long”,则返回-1;如果反之,则返回1,如果两者都不是,则返回0(或者其他任何东西)。

答案 1 :(得分:2)

假设您的数组是$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);

答案 2 :(得分:0)

或者,如果您只是在输入时跟踪哪些元素有“短”和“长”,则不需要对任何内容进行排序,例如:

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