Отсортировать массив по кол-ву слов /длинне текста

P
На сайте с 06.01.2009
Offline
601
571

Добрый день.

Имеем массив

$specmass2 = array('белый ламинат', 'ламинат серый 90', 'ламинат', 'ламинат трехполосный', 'ламинат 22 90');

Нужно отсортировать массив по кол-ву слов, затем по длинне текста.

Мысль только одна - через цикл, проверять кол-во слов, длинну текста и писать в новый массив. Но в какую ячейку, под каким номером, если размер массива может быть и 500 значений...

Оптимизайка
На сайте с 11.03.2012
Offline
396
#1
⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
P
На сайте с 06.01.2009
Offline
601
#2

Оптимизайка, спасибо. Но вот так с ходу за пол часа не разобрался, для меня это видимо сложновато.

сделал по аналогии


function cmp($a, $b)
{
if (substr_count($a, " ") == substr_count($b, " ")) {
return 0;
}
return (substr_count($a, " ") < substr_count($b, " ")) ? -1 : 1;

if (strlen($a) == strlen($b)) {
return 0;
}
return (strlen($a) < strlen($b)) ? -1 : 1;

}



$a = array('белый ламинат', 'ламинат серый 90', 'ламинат', 'ламинат 1 2 3 4', 'ламинат трехполосный', 'ламинат 22 90000');

usort($a, "cmp");




foreach ($a as $key => $value) {
echo "$key: $value\n";
}

результат вроде правильный? )


0: ламинат 1: ламинат трехполосный 2: белый ламинат 3: ламинат 22 90000 4: ламинат серый 90 5: ламинат 1 2 3 4
Оптимизайка
На сайте с 11.03.2012
Offline
396
#3

postavkin, порядок сортировки при необходимости измените (-1 и 1 местами поменять):


<?php

$arr = ['белый ламинат', 'ламинат серый 90', 'ламинат', 'ламинат трехполосный', 'ламинат 22 90'];

usort($arr, function($a, $b) {
$c1 = count(preg_split('~[^\p{L}\p{N}\']+~u', $a));
$c2 = count(preg_split('~[^\p{L}\p{N}\']+~u', $b));
if ($c1 == $c2) {
$l1 = strlen($a);
$l2 = strlen($b);
if ($l1 == $l2)
return 0;
return ($l1 < $l2) ? -1 : 1;
}
return ($c1 < $c2) ? -1 : 1;
});

var_dump($arr);
Апокалипсис
На сайте с 02.11.2008
Offline
391
#4

Оптимизайка, только preg_split замените на http://php.net/str_word_count :)

Записки нищего (http://zapiskinishego.ru) - мой личный блог Услуги php программиста. Очень нужна любая работа. Не покупают? Поведенческий аудит интернет-магазина за 5000 руб. (/ru/forum/990312)
P
На сайте с 06.01.2009
Offline
601
#5

Оптимизайка, спасибо.

Я сделал так /ru/forum/comment/15738903

Посмотрите, пож-та.

Вроде все корректно работает.

Если подтвердите что вариант рабочий, его оставлю, так как с ним мне будет проще делать в дальнейшем корректировки, нежели с preg.

Спасибо

Оптимизайка
На сайте с 11.03.2012
Offline
396
#6
Апокалипсис:
Оптимизайка, только preg_split замените на http://php.net/str_word_count :)

С русскими буквами он не работает, а так заменил бы конечно

S
На сайте с 30.09.2016
Offline
469
#7
postavkin:
Оптимизайка, спасибо.
Я сделал так /ru/forum/comment/15738903
Посмотрите, пож-та.
Вроде все корректно работает.

Оно не может корректно работать. В принципе. Потому что до второго условия процесс не дойдёт. Или - или, return же.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий