Лучший способ сортировки массива с самыми длинными строками в середине и самыми короткими в начале и конце - PullRequest
0 голосов
/ 06 сентября 2010

Просто ради удовольствия.Мне было любопытно, как лучше всего это сделать.

Ответы [ 4 ]

3 голосов
/ 06 сентября 2010

Вот один из способов сделать это (скорее всего, есть лучшее решение):

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);
2 голосов
/ 06 сентября 2010

Я бы сделал следующее:

  1. Сортировка исходного массива по длине строк (с помощью uasort () )
  2. Разделите массив пополам, поместив каждый элемент в один из двух массивов (в цикле foreach)
  3. Обратный второй массив (с array_reverse () )
  4. Объединить два массива вместе ( array_merge () )
1 голос
/ 06 сентября 2010

Вот решение, которое сохраняет ключи массива:

// 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]];
}
0 голосов
/ 06 сентября 2010

Первая попытка может состоять в том, чтобы сначала отсортировать их как обычно. Затем выполните итерацию по этому массиву, копируя в новый, с назначением копии, чередующимся между началом и концом нового массива, где начальный индекс увеличивается, а конечный индекс уменьшается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...