Сортировка массива по убыванию размера фраз

Статус
В этой теме нельзя размещать новые ответы.

Stripe

Участник
Регистрация
20 Окт 2007
Сообщения
164
Реакции
9
Столкнулся с проблемой.
Есть массив кеев
Array
(
[0] => Array
(
[0] => доставка учебников
[1] => Для просмотра ссылки Войди или Зарегистрируйся
)

[1] => Array
(
[0] => доставка цветов
[1] => Для просмотра ссылки Войди или Зарегистрируйся
)

[2] => Array
(
[0] => магазин учебников
[1] => Для просмотра ссылки Войди или Зарегистрируйся
)

[3] => Array
(
[0] => учебники
[1] => Для просмотра ссылки Войди или Зарегистрируйся
)

[4] => Array
(
[0] => учебники русского языка
[1] => Для просмотра ссылки Войди или Зарегистрируйся
)

)

Необходимо отсортировать его таким образом, что бы самый длинный элемент массива $array[$i][0] был на первом месте, и так по убыванию. В приведенном примере явно видно, что $array[4][0] должен быть первым, тогда как $array[3][0] последним. Как этого добиться?
 
Для просмотра ссылки Войди или Зарегистрируйся( которые явно вы должны были изучать)

все что вам нужно, так это изменить критерий сортировки с сравнения элементов массивов, на сравнение длин строк этих элементов
 
За ссылку спасибо, но я ни кому ни чего не должен был и не изучал их.
UPD:
Да, вы дали абсалютно правильное направление поиска. Вот что у меня получилось.
$inarr = mysql_query("SELECT * FROM `keys`");
while( $inresarr = mysql_fetch_array($inarr) ) {
$dlina = strlen($inresarr["anchor"]); // Получаем длину строки
$outkey[] = array($dlina,$inresarr["anchor"],$inresarr["url"]);
}
$outas = sizeof($outkey);
rsort($outkey);
 
За ссылку спасибо, но я ни кому ни чего не должен был и не изучал их.
человек который хоть отдаленно занимаеться программированием должен это учить :)

PHP:
      function qsort (&$array, $left, $right) {  
        $i = $left;
        $j = $right;
        $x = $array[($left + $right) / 2];
        do {
            while (strlen($array[$i][0]) < strlen($x[0]))  $i++;
            while (strlen($array[$j][0]) > strlen($x[0])) $j--;
            if ($i <= $j) {
                if (strlen($array[$i][0]) > strlen($array[$j][0]))
                list($array[$i], $array[$j]) = array($array[$j],$array[$i]);
                 $i++;
                 $j--;
                }
        } while ($i <= $j);
                if ($i < $right) qsort ($array, $i, $right);
                if ($j > $left) qsort ($array, $left, $j);
    }

  $array1 = array(  array("доставка учебников", 'http://megalololo.ru/'),
                    array("доставка цветов", 'http://megalololo.ru/'),
                    array("магазин учебников", 'http://megalololo.ru/'),
                    array("учебники", 'http://megalololo.ru/'),
                    array("учебники русского языка", 'http://megalololo.ru/')
                 );



qsort($array1, 0, count($array1)-1);
print_r($array1);
------------
я так понял данный массив вы дергаете с БД, если да, то думаю будет быстрее если переложить выполнение данной работы на СУБД
PHP:
SELECT url, anchor, LENGTH(anchor) as lenght  FROM `keys`
  ORDER BY anchor DESC
 
Я бы через usort делал и не парился.

PHP:
function complen($a1, $a2) {
 return  strlen($a1[0]) - strlen($a2[0]);
}
usort($arr, 'complen');   // в $arr - твой массив

как-то так..
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху