代码之家  ›  专栏  ›  技术社区  ›  BMBM

数组排序顺序困难

  •  1
  • BMBM  · 技术社区  · 15 年前

    我有一个这样的数组:

    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 包含 短的 必须是第一个(如果有)
    • 构成要素 长的 必须是最后一个(如果存在)
    • 两者之间的顺序无关紧要。

    所以这个例子是这样的:

    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 回复  |  直到 15 年前
        1
  •  2
  •   scribble    15 年前

    假设你的数组是 $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
  •  2
  •   Amber    15 年前

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

        3
  •  0
  •   Hairy Jock    15 年前

    或者,如果在输入时只跟踪哪些元素有“short”和“long”,则不需要对它们进行排序,例如:

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