[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удалить из массива элементы длиной меньше 3 букв
linf
Есть массив - $mass (содержащий слова), Задача - удалить все элементы массива, длинна которых короче трех символов.

Мое решение таково:
PHP
for ($i=0; $i<=count($mass); $i++) {if(strlen(iconv("UTF-8","koi8-r",$mass[$i])) < 3)  {unset($mass[$i]);}}


недостатки:
- strlen не поддерживает UTF-8 (в которой я пишу) приходится делать для некоторых функций преобразование.
- удаляются не элементы массива, а их значения.

Можно ли полностью удалить элементы массива имеющие длину менее 3х символов, используя функцию array_filter, если да, то как?



Спустя 11 минут, 42 секунды (30.07.2009 - 04:38) kirik написал(а):
Цитата (linf @ 29.07.2009 - 20:26)
strlen не поддерживает UTF-8 (в которой я пишу) приходится делать для некоторых функций преобразование.

функции mb_*() служат для работы с мультибайтовыми кодировками. Для этого должен стоять модуль mb_string.

Цитата (linf @ 29.07.2009 - 20:26)
удаляются не элементы массива, а их значения.

Правильно, ведь ты значения и удаляешь smile.gif Чтобы очистить массив от пустых значений, юзай array_filter()

Спустя 4 минуты, 22 секунды (30.07.2009 - 04:42) kirik написал(а):
У меня кстати нормально и без array_filter удаляет:
PHP
$array = array('asdf', 'ds', 'asdfa');
for(
$i = 0, $c = count($array); $i < $c; $i++)
{
    if(mb_strlen($array[$i]) < 3)
        unset($array[$i]);
}
// $array = array_filter($array);
print_r($array);
// Получаем
// Array
// (
//     [0] => asdf
//     [2] => asdfa
// )

Спустя 3 часа, 48 минут, 34 секунды (30.07.2009 - 08:31) linf написал(а):
kirik у меня нечего не удаляет, кстати а зачем в цикле две переменных?

эх мне бы всетаки примерчик с array_filter, так как в мануалах там совсем не то, что нужно рассматривают...

Спустя 28 минут, 8 секунд (30.07.2009 - 08:59) sergeiss написал(а):
Цитата (linf @ 30.07.2009 - 09:31)
у меня нечего не удаляет

Тогда еще один вопрос: а как ты проверяешь, что должно было удалиться, а не удалилось? У тебя в цикле не видать никаких контрольных распечаток. Но если ты прямо в цикле перед unset сделаешь вывод данных, то можно будет более точно контролировать процесс.

Спустя 34 минуты, 17 секунд (30.07.2009 - 09:33) kirik написал(а):
Цитата (linf @ 30.07.2009 - 00:31)
эх мне бы всетаки примерчик с array_filter

Дык яж тебе написал.. Закоменченная строчка..

Цитата (linf @ 30.07.2009 - 00:31)
кстати а зачем в цикле две переменных?

Потому что если написать так как у тебя, то функция count($mass) будет выполнятся столько раз, сколько будет проходов в цикле. Тоесть если в массиве будет тысяча элементов, то у тебя тысячу раз они будут персчитываться заново. А в коде который я привел подсчет происходит только один раз, при первой итерации.

Спустя 1 час, 17 минут, 43 секунды (30.07.2009 - 10:51) linf написал(а):
$array = array_filter($array); - ну так это понятно, а как параметры фильтраци задать???

Спустя 14 минут, 8 секунд (30.07.2009 - 11:05) Nikitian написал(а):
Цитата (linf @ 30.07.2009 - 07:51)
$array = array_filter($array); - ну так это понятно, а как параметры фильтраци задать???

Здесь доки с примерами.

Кратко: вторым параметром задаётся callback-функция, которая и осуществляет фильтрацию.

Спустя 7 часов, 18 минут (30.07.2009 - 18:23) linf написал(а):
Цитата (Nikitian @ 30.07.2009 - 12:05)
Цитата (linf @ 30.07.2009 - 07:51)
$array = array_filter($array); - ну так это понятно, а как параметры фильтраци задать???

Здесь доки с примерами.

Кратко: вторым параметром задаётся callback-функция, которая и осуществляет фильтрацию.

Я мануал это прочитал уже, но там рассматриваются функции even и odd (четный и нечетный), это не совсем то...

Спустя 37 минут, 30 секунд (30.07.2009 - 19:01) kirik написал(а):
Цитата (linf @ 30.07.2009 - 10:23)
Я мануал это прочитал уже, но там рассматриваются функции even и odd (четный и нечетный), это не совсем то...

Ну дык на то это и пример, предполагается что программист сам должен применить свои условия к примеру..

PHP
function filter($value)
{
    return (mb_strlen($value) >= 3);
}

$array = array('asdf', 'ds', 'asdfa');
$array = array_filter($array, 'filter');
print_r($array);

Спустя 10 часов, 15 минут, 15 секунд (31.07.2009 - 05:16) linf написал(а):
Всеравно как то странно работает. Массив наполнен совами (РУССКИМИ, в UTF-8), и какие то слова функция фильтрует, но не факт, что короче трех символов.

Может тогда лучше вырезать не из массива, а из строки? по какой нибуть маске, так как все слова разделены пробелами.

Только как это можно сделать? Ведь строковые функции не корректно работают с UTF-8

Спустя 17 минут, 57 секунд (31.07.2009 - 05:34) kirik написал(а):
ЧЯДНТ?
PHP
function filter($value)
{
    return (
mb_strlen($value) >= 3);
}

$array = array('тест1''ыыы''то''сё''йй');
$array array_filter($array'filter');
print_r($array);


Попробуй заменить mb_strlen($value) на mb_strlen($value, 'UTF-8') мож тебе поможет.. smile.gif

Спустя 7 минут, 25 секунд (31.07.2009 - 05:41) linf написал(а):
wink.gif еееееееееее... все работает как надо...
получается во все строковые функции можно дописать UTF-8 и будет все лучше?

Спустя 6 минут, 40 секунд (31.07.2009 - 05:48) linf написал(а):
PHP
$line strtolower($line'UTF-8');
- а вот это почему то не хочет так работать, приходится делать:

PHP
$search = array('Й','Ц','У','К','Е','Н','Г','Ш','Щ','З','Х','Ъ','Ф','Ы','В','А','П','Р','О','Л','Д','Ж','Э','Я','Ч','С','М','И','Т','Ь','Б','Ю','Ё');
$replace = array('й','ц','у','к','е','н','г','ш','щ','з','х','ъ','ф','ы','в','а','п','р','о','л','д','ж','э','я','ч','с','м','и','т','ь','б','ю','ё');
$line str_replace($search$replace$line);

Спустя 34 минуты, 29 секунд (31.07.2009 - 06:22) kirik написал(а):
Цитата (linf @ 30.07.2009 - 21:48)
$line = strtolower($line, 'UTF-8');
- а вот это почему то не хочет так работать, приходится делать:


Используй функции для работы с мультибайтовыми строками, я ведь показал выше... mb_strtolower() например

Спустя 1 час, 53 минуты, 15 секунд (31.07.2009 - 08:16) linf написал(а):
kirik ок, это именно то, что нужно, тока чего то русский язык теперь на php.net куда то пропал =))

Спустя 19 минут, 58 секунд (31.07.2009 - 08:36) kirik написал(а):
Цитата (linf @ 31.07.2009 - 00:16)
тока чего то русский язык теперь на php.net куда то пропал

Угу..) Переодически что-то пропадает..


_____________
Live in new format =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.