对数组进行排序的最佳方法是在中间使用最长的字符串,在开头和结尾使用最短的字符串

时间:2010-09-05 20:43:26

标签: php arrays sorting

真的很开心。我很好奇最好的方法。

4 个答案:

答案 0 :(得分:3)

这是一种方法(最有可能是更好的解决方案):

function sort_length($str1, $str2)
{
    if(strlen($str1) == strlen($str2))
    {
        return 0;
    }
    return strlen($str1) > strlen($str2) ? -1 : 1;
}
$words = array("Hello", "World", "this", "is", "a", "test");
usort($words, 'sort_length');

$new_list = array();
$boolean = true;
foreach($words as $word)
{
    if($boolean)
    {
        array_push($new_list, $word);
    }
    else
    {
        array_unshift($new_list, $word);
    }
    $boolean = !$boolean;
}

//print_r($new_list);

答案 1 :(得分:2)

我会做以下事情:

  1. 按字符串的长度(使用uasort()
  2. 对原始数组进行排序
  3. 通过将每个元素放在两个数组之一(在foreach循环中)将数组分成两半
  4. 反转第二个数组(使用array_reverse()
  5. 将两个数组合并在一起(使用array_merge()

答案 2 :(得分:1)

这是一个保留数组键的解决方案:

// function to compare two strings by their length
function cmp_strlen($a, $b) {
    return strlen($a) - strlen($b);
}

// sort array by length while preserving the keys
uasort($arr, 'cmp_strlen');

$ordered = array();
$keys = array_keys($arr);

// fill $ordered with odd keys in order
for ($i=0, $n=count($keys); $i<$n; $i+=2) {
    $ordered[$keys[$i]] = $arr[$keys[$i]];
}
// fill $ordered with even keys in reverse order
for ($i=((count($keys)>>1)<<1)-1; $i>0; $i-=2) {
    $ordered[$keys[$i]] = $arr[$keys[$i]];
}

答案 3 :(得分:0)

首次尝试可能是首先将它们排序为正常。然后迭代遍历此数组,复制到新数组,复制目标在新数组的开始和结束之间交替,其中开始索引递增,结束索引递减。