Свернутый текст
Здравствуйте!
Помогите пожалуйста разделить текст на массив, который уже находится в массиве.
Дано:
Что хочу в итоге получить:
Дальше я начал и тут же закончил:
Пока в ступоре, как мне текст в массиве разделить на массивы по заданному разделителю.
Функцией explode гонять с помощью циклов или как-то по другому?
Подскажите логику, пожалуйста!
Помогите пожалуйста разделить текст на массив, который уже находится в массиве.
Дано:
$razdelitel_texta = '<razdelitel>';//это основной разделитель, по нему делю
//на 2 массива, дальше этот массив надо разделить на массивы
//по тем разделителям, которые идут после "бла"
$text = '
бла1
<razdelitel1>
бла2
<razdelitel2>
бла3
<razdelitel3>
бла4
<razdelitel>
блабла1
<razdelitel1>
блабла2
<razdelitel2>
блабла3
<razdelitel3>
блабла4
<razdelitel>';
Что хочу в итоге получить:
array (
[0] => Array ( [0] => бла1 [1] => бла2 [2] => бла3 [3] => бла4)
[1] => Array ( [0] => блабла1 [1] => блабла2 [2] => блабла3 [3] => блабла4)
);
Дальше я начал и тут же закончил:
$array_text = explode ($razdelitel_texta,$text);
print_r ($array_text);
Пока в ступоре, как мне текст в массиве разделить на массивы по заданному разделителю.
Функцией explode гонять с помощью циклов или как-то по другому?
Подскажите логику, пожалуйста!
UPDATE.
Все получилось(но может кто предложит лучше), результат в этом сообщении:
http://phpforum.ru/index.php?act=Print&cli...imin=11&limit=1
Спустя 18 минут, 59 секунд (20.02.2012 - 23:00) sergeiss написал(а):
Не совсем понял, что ты хочешь.
Цитата (idimka39 @ 20.02.2012 - 23:41) |
Помогите пожалуйста разделить текст на массив, который уже находится в массиве. |
Но начальный текст находится в текстовой строке, вроде как.
А вообще, тебе должна помочь функция explode(), мне так кажется. Сначала по одному разделителю, а потом по другому, уже внутри каждого элемента начального массива. Это при условии, что у тебя внутри блоков данных есть один разделитель, а между блоками данных - другой разделитель.
Спустя 7 минут, 34 секунды (20.02.2012 - 23:07) walerus написал(а):
preg_match_all( '~((.*)<.*>)+~iUs', $text, $match );
print_r($match[2]);
Только потом пробелы поудаляй в массиве.
Спустя 17 часов, 10 минут, 12 секунд (21.02.2012 - 16:18) idimka39 написал(а):
Цитата (sergeiss @ 20.02.2012 - 20:00) | ||
Не совсем понял, что ты хочешь.
Но начальный текст находится в текстовой строке, вроде как. А вообще, тебе должна помочь функция explode(), мне так кажется. Сначала по одному разделителю, а потом по другому, уже внутри каждого элемента начального массива. Это при условии, что у тебя внутри блоков данных есть один разделитель, а между блоками данных - другой разделитель. |
Да, начальный текст в строке, просто я написал ниже "что начал и тут же закончил", т.е. я сначала фукнцией explode разделил массив по разделителю "<razdelitel>", а дальше уже не смог разделить в массиве на еще один массив.
А дальше разделять функцией explode это будет разве правильно? Если использовать substr и strpos вместо explode будет какой-нибудь выигрыш в быстроте/ресурсоемкости?
У меня этот код будет срабатывать при каждом запросе к странице.
walerus, а зачем пробелы удалять в массиве? Я просто текст хочу занести в массив(и чтоб он оставался в не изменном виде), а там уже в зависимости от условий, какую-то часть массива выводить, а какую-то нет.
Спустя 12 минут, 29 секунд (21.02.2012 - 16:30) walerus написал(а):
idimka39 запусти скрипт, поймешь про какие я пробелы...
если не понял:
если не понял:
Свернутый текст
используй trim(), к каждой ячейки, потому что есть пробелы впереди и сзади....
Спустя 35 минут, 26 секунд (21.02.2012 - 17:06) Commander Keen написал(а):
Цитата |
Разделение текста на массив, который в массиве |
Это как глюк, который я видел, когда был в глюке. (с) Phill. J. Fry.
Да простят меня за оффтоп =)
Спустя 2 часа, 52 минуты, 7 секунд (21.02.2012 - 19:58) sergeiss написал(а):
Цитата (idimka39 @ 21.02.2012 - 17:18) |
Да, начальный текст в строке, просто я написал ниже "что начал и тут же закончил", т.е. я сначала фукнцией explode разделил массив по разделителю "<razdelitel>", а дальше уже не смог разделить в массиве на еще один массив. |
Я имел ввиду другое Сначала тебе надо было разделить по "пустой строке", а потом уже по специальному разделителю.
Спустя 1 час, 15 минут, 37 секунд (21.02.2012 - 21:13) idimka39 написал(а):
Сейчас могу делить по 2 делителям, но по 3 не получается:
sergeiss, а смысл делить сначала по пустой строке, если делитель между текстами у меня известен, это '<razdelitel1>'?
$text = '
бла1
<razdelitel1>
бла2
<razdelitel2>
бла3
<razdelitel3>
бла4
<razdelitel>
блабла1
<razdelitel1>
блабла2
<razdelitel2>
блабла3
<razdelitel3>
блабла4
<razdelitel>';
$array_text = explode ('<razdelitel>',$text);
for ($i=0;$i<count($array_text);$i++)
{
$a = explode ('<razdelitel1>',$array_text[$i]);
$b = explode ('<razdelitel2>',$array_text[$i]);//по этому разделителю никак не получается
$array_text[$i] = $a;
//$array_text[$i] = $b;//не знаю как его добавить в массив.
}
print_r ($array_text);
sergeiss, а смысл делить сначала по пустой строке, если делитель между текстами у меня известен, это '<razdelitel1>'?
Спустя 8 минут, 49 секунд (21.02.2012 - 21:22) sergeiss написал(а):
Цитата (idimka39 @ 21.02.2012 - 22:13) |
sergeiss, а смысл делить сначала по пустой строке, если делитель между текстами у меня известен, это '<razdelitel1>'? |
Потому что в итоге ты хочешь получить
Цитата |
Что хочу в итоге получить: array ( [0] => Array ( [0] => бла1 [1] => бла2 [2] => бла3 [3] => бла4) [1] => Array ( [0] => блабла1 [1] => блабла2 [2] => блабла3 [3] => блабла4) ); |
Спустя 8 минут, 42 секунды (21.02.2012 - 21:31) walerus написал(а):
idimka39 - о чем беседа то ?, я вообще поражен, зачем спрашивать как сделать что то, если в итоге этим не пользоваться??, я кому регулярку написал ?, себе чтоб не забыть ???
Тебя такой ответ не устраивает ?
Тебя такой ответ не устраивает ?
Array
(
[0] => бла1
[1] => бла2
[2] => бла3
[3] => бла4
[4] => блабла1
[5] => блабла2
[6] => блабла3
[7] => блабла4
)
Спустя 1 час, 5 минут, 43 секунды (21.02.2012 - 22:36) idimka39 написал(а):
walerus, регулярки пока не ставлю, потому ничего готового пока нет. основное пока не получилось! пробелы на данном этапе не критичны.
Такой вариант меня не устраивает, потому что мне нужно:
и при этом я должен знать, что именно в массиве[0][1] лежит то, что попало туда по разделителю "<razdelitel1>" и т.д.
sergeiss, это в примере для наглядности кода использован перевод строки между блоками текста: пустая строка может быть, может не быть или быть несколько строк, поэтому тут расчет именно на разделитель "<razdelitel>"!
Такой вариант меня не устраивает, потому что мне нужно:
Array
(
[0] => array (
[0] => бла1
[1] => бла2
[2] => бла3
[3] => бла4
)
[1] => array (
[0] => блабла1
[1] => блабла2
[2] => блабла3
[3] => блабла4
)
и при этом я должен знать, что именно в массиве[0][1] лежит то, что попало туда по разделителю "<razdelitel1>" и т.д.
sergeiss, это в примере для наглядности кода использован перевод строки между блоками текста: пустая строка может быть, может не быть или быть несколько строк, поэтому тут расчет именно на разделитель "<razdelitel>"!
Спустя 15 часов, 43 минуты, 30 секунд (22.02.2012 - 14:20) idimka39 написал(а):
Ну вот, справился.
Может быть кому-то пригодится, а также буду рад, кто посоветует, что оптимизировать в коде(т.к. в php я новичок) или какой-нибудь альтернативный вариант:
Результат будет выглядеть так:
Может быть кому-то пригодится, а также буду рад, кто посоветует, что оптимизировать в коде(т.к. в php я новичок) или какой-нибудь альтернативный вариант:
$razdelitel_texta = '<razdelitel>';//разделитель между текстами
$razdeliteli = array ('<razdelitel1>','<razdelitel2>','<razdelitel3>');//разделители В тексте
$text = '
бла1
<razdelitel1>
бла2
<razdelitel2>
бла3
<razdelitel3>
бла4
<razdelitel>
блабла1
<razdelitel1>
блабла2
<razdelitel2>
блабла3
<razdelitel3>
блабла4
<razdelitel>';//заданный текст
//Разделяю текст по разделителю "между текстами"
$text = explode ($razdelitel_texta,$text);
foreach ($text as $key=>$value)
{
if($value){//проверка пустое значение в массиве или нет.
$array[$key] = array();
$a = explode ($razdeliteli[0],$value);//делю по первому разделителю
array_push ($array[$key],trim($a[0]));//записываю первый элемент
for ($i=1;$i<count($razdeliteli);$i++){//считаю кол-во разделителей, но беру кроме 1-ого, т.к. его уже использовал выше
$a = explode ($razdeliteli[$i],$a[1]);//делю текст по всем разделителям которые в переменной $razdeliteli (разделители В тексте)
//массив который делю - беру из $a[1], а записываю в $array из - $a[0]
array_push ($array[$key],trim($a[0]));
}
array_push ($array[$key],trim($a[1]));//записываю последний элемент (который до разделителя "между текстами", но после всех разделителей)
}
}
print_r ($array);//посмотреть результат
Результат будет выглядеть так:
Array (
[0] => Array ( [0] => бла1 [1] => бла2 [2] => бла3 [3] => бла4 )
[1] => Array ( [0] => блабла1 [1] => блабла2 [2] => блабла3 [3] => блабла4
) )
Спустя 2 минуты, 32 секунды (22.02.2012 - 14:23) sergeiss написал(а):
Давай для наглядности возьмём определенный разделители. Допустим, для разделения блоков используем "точку с запятой", а внутри блока - запятую, пробел, табуляцию или новую строку, можно даже и то, и другое, и третье (и четвертое) сразу. Пустые строки, как и пустые элементы, нам не важны будут.
Допустим, у тебя есть такие исходные данные
Вот этот код делит так, как надо ("немного" поменьше, чем у тебя и более универсальный :))
Правда, тут лучше не explode() подходит, а preg_match().
На выходе имеем:
Допустим, у тебя есть такие исходные данные
$text = '
бла1 бла2, бла3 бла4;
блабла1, блабла2,
блабла3,
блабла4';
Вот этот код делит так, как надо ("немного" поменьше, чем у тебя и более универсальный :))
$arr_main=preg_split( "/[;]/", $text, 0, PREG_SPLIT_NO_EMPTY );
foreach( $arr_main as $k => $value )
{
$arr_main[$k]=preg_split( "/[\s,]/", $value, 0, PREG_SPLIT_NO_EMPTY );
}
echo '<pre>'.print_r( $arr_main, true).'</pre>';
Правда, тут лучше не explode() подходит, а preg_match().
На выходе имеем:
Array
(
[0] => Array
(
[0] => бла1
[1] => бла2
[2] => бла3
[3] => бла4
)
[1] => Array
(
[0] => блабла1
[1] => блабла2
[2] => блабла3
[3] => блабла4
)
)