[PHP] Элегантный способ преобразования многострочной переменной в массив

12
slavegirl
На сайте с 25.06.2012
Offline
388
3686

Здравствуйте!

Ребята, очень надеюсь на Вашу помощь!

У меня есть вот такая многострочная переменная:


$modSettings['white_list'] = '

depic.me
fastpic.ru
fboom.me
file.al
fileboom.me
filesmonster.com


filespace.com
filesmonster.com


';

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

Из этой переменной требуется получить простой массив доменов без пустых значений и только с уникальными элементами:


Array
(
[0] => depic.me
[1] => fastpic.ru
[2] => fboom.me
[3] => file.al
[4] => fileboom.me
[5] => filesmonster.com
[6] => filespace.com
)

Существует ли элегантный способ это сделать? Цель - оптимизация кода (по возможности без использования регулярных выражений).

Как бы Вы реализовали данный алгоритм? Возможно, мне неизвестно о каких-нибудь специфических функциях в PHP.

Заранее большое спасибо за любые примеры!

https://t.me/joinchat/RKtR6f68OwU1NzM6  ❤️‍🔥  Сарказм is my orgazm
дани мапов
На сайте с 06.09.2012
Offline
204
#1


$array = preg_split ('/\s+/U', $content, -1, PREG_SPLIT_NO_EMPTY);
Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
S
На сайте с 13.10.2014
Offline
171
#2

можно еще explode (PHP_EOL,$modSettings[white_list']);

правда тут есть один фокус. конец строки в разных системах определяются разными кодами 1 или 2 байтами. т.е. если данные в массив получаются с другой платформы, то будут ошибки разбора. как вариант устранения preg_split("/\\r\\n|\\r|\\n/", $modSettings[white_list']);

W
На сайте с 09.04.2013
Offline
46
#3


print_r(array_unique(str_word_count($var, 1,'.')));
slavegirl
На сайте с 25.06.2012
Offline
388
#4

webjey, большое Вам спасибо! Воспользовалась Вашим вариантом, он подошёл просто идеально! Правда, там есть один нюанс: функция str_word_count() умеет работать с третьим аргументом только при версии PHP 5.1.0 и выше.

Также Ваш код на одном и том же наборе данных выполняется примерно в 3 раза быстрее, чем предложенный в первом комментарии:


$array = array_unique(preg_split('/\s+/U', $content, -1, PREG_SPLIT_NO_EMPTY));

silicoid, Ваш пример, к сожалению, мне не удалось запустить, поэтому ничего не могу о нём сказать.

S
На сайте с 13.10.2014
Offline
171
#5
slavegirl:
Ваш пример, к сожалению, мне не удалось запустить

прошу прощения, что не получилось запустить?

<?php


$modSettings['white_list'] = '
depic.me
fastpic.ru
fboom.me
file.al
fileboom.me
filesmonster.com
filespace.com
filesmonster.com
';

print_r (explode (PHP_EOL,$modSettings['white_list']));
print_r (preg_split("/\\r\\n|\\r|\\n/", $modSettings['white_list']));

// если надо избавиться от пустых ячеек
print_r (array_diff(explode(PHP_EOL,$modSettings['white_list']), array(NULL)));
print_r (array_diff(preg_split("/\\r\\n|\\r|\\n/", $modSettings['white_list']), array(NULL)));


// если надо избавиться от пустых ячеек, ненужных табов и пробелов
print_r (str_replace(array("\t",' '),array('',''),array_diff(explode(PHP_EOL,$modSettings['white_list']), array(NULL))));
J
На сайте с 20.02.2014
Offline
120
jkm
#6
дани мапов:

$array = preg_split ('/\s+/U', $content, -1, PREG_SPLIT_NO_EMPTY);

Вот зря там добавили в шаблон модификатор U (PCRE_UNGREEDY).

Это делает квантификатор не жадным и в результатах будет куча пустых строк, на удаление которых тратится дополнительное время.

В данном случае модификатор U лучше убрать.

slavegirl
На сайте с 25.06.2012
Offline
388
#7
silicoid:
прошу прощения, что не получилось запустить?

silicoid, извините меня, была моя ошибка...

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

Результат тестирования времени выполнения:

Вариант предложенный webjey работает правильно и быстрее всего.

Благодаря описанным выше примерам, у меня получилось увеличить скорость нужного мне участка кода в 8 раз!

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#8
Правда, там есть один нюанс: функция str_word_count() умеет работать с третьим аргументом только при версии PHP 5.1.0 и выше.

В эпоху PHP7, Да... это проблема...

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
slavegirl
На сайте с 25.06.2012
Offline
388
#9

LEOnidUKG, у меня SMF 2.0.13 (и полсотни установленных модификаций), он не работает на PHP 7. Если выполнить обновление, там столько проблем возникнет, что проще будет повеситься...

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#10
slavegirl:
LEOnidUKG, у меня SMF 2.0.13 (и полсотни установленных модификаций), он не работает на PHP 7. Если выполнить обновление, там столько проблем возникнет, что проще будет повеситься...

А у вас какой PHP стоит? 5.0? или PHP 4?

12

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