[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разделение текста на массив, который в массиве
idimka39
Свернутый текст
Здравствуйте!
Помогите пожалуйста разделить текст на массив, который уже находится в массиве.

Дано:

$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)
Не совсем понял, что ты хочешь.
Цитата (idimka39 @ 20.02.2012 - 23:41)
Помогите пожалуйста разделить текст на массив, который уже находится в массиве.

Но начальный текст находится в текстовой строке, вроде как.

А вообще, тебе должна помочь функция 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>", а дальше уже не смог разделить в массиве на еще один массив.

Я имел ввиду другое smile.gif Сначала тебе надо было разделить по "пустой строке", а потом уже по специальному разделителю.

Спустя 1 час, 15 минут, 37 секунд (21.02.2012 - 21:13) idimka39 написал(а):
Сейчас могу делить по 2 делителям, но по 3 не получается:


$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, регулярки пока не ставлю, потому ничего готового пока нет. основное пока не получилось! пробелы на данном этапе не критичны.

Такой вариант меня не устраивает, потому что мне нужно:


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 я новичок) или какой-нибудь альтернативный вариант:


$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 написал(а):
Давай для наглядности возьмём определенный разделители. Допустим, для разделения блоков используем "точку с запятой", а внутри блока - запятую, пробел, табуляцию или новую строку, можно даже и то, и другое, и третье (и четвертое) сразу. Пустые строки, как и пустые элементы, нам не важны будут.
Допустим, у тебя есть такие исходные данные
$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
)

)
Быстрый ответ:

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