Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Разбивка в массив


Автор: Aliance 20.5.2005, 22:14
Как пользоватся двойным explode().
Задача такая, есть код страницы, которую я получаю с помощью file_get_contents.
Там примерно такой код:
Цитата

login=Альянс© 123
login_online=
id=1031213947
align=7
zodiac=9
blocked=
img=0
room_name=
battle_id=

Разбиваю его explode()`ом на массив, по \n. Все отлично. Получается, в первом елементе содержится: login=Альянс© 123, вот код:
Код

<?php
if(!function_exists('file_get_contents')) {
   function file_get_contents($file) {
       $file = file($file);
       return !$file ? false : implode('', $file);
   }
}

$infoText = file_get_contents('http://...........');

$lists = explode("\n", $infoText);

echo "Имя: {$lists[0]}";
// выводит login=Альянс© 123


Теперь, нужно эти все данные так же разбить на массив. Мне нужно получить все, что нах-ся после =, но есть суровые ограничения из-за которых мне эта задача не под силу:
( я буду нижу значением называть ту часть строки, котора лежит правее =)
  • в значении могут быть пробелы
  • в значении могут быть знаки =
  • в значении может ничего не быть
  • в значении могут быть спецсимволы/кириллица/латиница/Юникод

Помогите разбить smile

Автор: Mal Hack 20.5.2005, 22:36
Ну я думаю тут проще регуляркой, когда все данные в одной строке.
Код
<?php
$str="login=Àëüÿíñ© 123
login_online=
id=1031213947
align=7
zodiac=9
blocked=
img=0
room_name=
battle_id=;;";
preg_match_all( "#=(.*?)(\n|$)#i" , $str , $matches , PREG_PATTERN_ORDER );
print_r($matches[1]);

?>

Автор: Aliance 20.5.2005, 23:03
Эм, код пока не проверял. Но т.к. я трезво оцениваю свои силы - то не хочу тратить свое время, т.к. знаю что сам код не переделаю. Не мог бы ты сохранить то, что есть у меня... Т.е. первых explode()... ведь данные у меня динамические...я ж все описал smile

Автор: Mal Hack 20.5.2005, 23:07
Aliance при моем коде тебе не нужны explode'ы...

Автор: Aliance 21.5.2005, 14:47
Mal Hack
Мне выводит Array. А как вывести опр. его части, не понимаю smile
Например, мне нужно вывести значение id=1031213947, т.е. 1031213947 - как это сделать?
Индекс у него 2 (третий элемент).
Код

echo $matches[2];

не то...

Автор: Mal Hack 21.5.2005, 14:57
Код
<?php
$str="login=xcvx 123
login_online=
id=1031213947
align=7
zodiac=9
blocked=
img=0
room_name=
battle_id=;;";
preg_match_all( "#(.+?)=(.*?)(?:\n|$)#i" , $str , $matches , PREG_PATTERN_ORDER );
for( $i = 0 ; $i< count($matches[1]) ; $i++ )
{ print $matches[1][$i] . " = " . $matches[2][$i]."<br>";  }
?>

Вывод:
Цитата
login = xcvx 123
login_online =
id = 1031213947
align = 7
zodiac = 9
blocked =
img = 0
room_name =
battle_id = ;;


Еще глянь: http://php.net/parse_ini_file

Автор: Aliance 21.5.2005, 15:47
Mal Hack
Т.е. это разобьет его на 2 - лево право?
Мне то, что слева не нужно smile
Т.е. обращаться так:
Код

$matches[2][0]
$matches[2][1]
$matches[2][2]
$matches[2][3]


А
Код

$matches[1][х]

выдаст нам левую часть?

Автор: Mal Hack 21.5.2005, 15:52
Aliance е-мое. Только для правой части я тебе выше код давал.

Автор: Aliance 21.5.2005, 18:31
Mal Hack
Все, разобрался. 1 - лево. 2 - право. Спасибо.

Автор: IZ@TOP 22.5.2005, 18:17
Aliance, а не проще считывать файл в строки (file(path)) а уже потом explode использовать?

Автор: Aliance 22.5.2005, 18:29
IZ@TOP
Этот файл не на моем домене находится :-) Собсно вопрос уже закрыт. Мне получилось, Mal Hack помог smile

Автор: Mal Hack 22.5.2005, 18:30
IZ@TOP лишние операции, лишние переменные. Памяти кушает больше...
По времени выполнения в принципе равнозначно.

Автор: Opik 23.5.2005, 00:57
IZ@TOP
не проще... smile он инфу просто не получит таким образом.

Автор: IZ@TOP 23.5.2005, 20:29
Цитата(Mal @ 22.5.2005, 19:30)
IZ@TOP лишние операции, лишние переменные. Памяти кушает больше...

Где тут лишние переменные??? Но выполнятся наверное будет все же равнозначно...

Opr, в таком случае file_get_contents тоже не сработает (но это уже вопрос конфигурации).

Автор: Opik 23.5.2005, 20:41
IZ@TOP
вопрос не в конфигурации, а к тому скрипту, к которому идет коннект smile он просто перекинет его на главную.

Автор: IZ@TOP 24.5.2005, 03:20
Цитата(Opr @ 23.5.2005, 21:41)
вопрос не в конфигурации, а к тому скрипту, к которому идет коннект  он просто перекинет его на главную.

Ничего не понимаю... причем тут это? Может объяснишь подробнее почему при использовании file_get_contents он пиолучит данные а при использовании file не получит???

Автор: Opik 24.5.2005, 03:25
IZ@TOP
по идее при помощи file_get_contents тоже не должен получать.
Добавлено @ 03:29
Странно smile всё таки получит...
но в inf.pl (БКном )
есть строчки:

Код

        if ($ENV{"HTTP_USER_AGENT"}=~/PHP\//) { 
                print "Location: /index.html\n\n";
                goto FASTCGI_EXIT;
        }

и когда тогда это условие будет верным?

Автор: IZ@TOP 24.5.2005, 04:02
Opr, а тут речь разве о combats.ru идет? Что-то я уже запутался.

PS Извиняюсь за тупость, у меня всю ночь зуб болит, я спать немогу и думать тоже... таблетки уже не помогают...

Автор: Aliance 24.5.2005, 15:54
smile
Цитата(Opr @ 24.5.2005, 04:25)
но в inf.pl (БКном )

Цитата(IZ @ 24.5.2005, 05:02)
Opr, а тут речь разве о combats.ru идет?

как вы догадались smile smile smile
smile

Дак ведь у меня все работает, зачем спорить-т )))

Автор: Opik 24.5.2005, 19:26
IZ@TOP
причем?))))
Цитата
Там примерно такой код:

Цитата 

login=Альянс© 123
login_online=
id=1031213947
align=7
zodiac=9
blocked=
img=0
room_name=
battle_id= 
- из первого поста.
http://devilscity.combats.ru/inf.pl?login=6-th%20Element&short=1 и тут посмотри... ничего схожего не видишь?*)))
Aliance за 2 кода кодинга узнаю любую часть smile))
Цитата
Дак ведь у меня все работает, зачем спорить-т )))

при частом коннекте будет блок по ИП smile

Автор: Aliance 24.5.2005, 20:47
Цитата(Opr @ 24.5.2005, 20:26)
при частом коннекте будет блок по ИП

знам... ну это при очем частом smile Ну, в общем-то я доволен smile))
ЗЫ: ты такое делал? Кстати, можно пообщаться на эту тему, пиши на e-mail если будет желания (ася не работает временно)

Автор: Opik 25.5.2005, 12:32
Aliance
делал smile и не только такое) ну не сказал бы... рекомендуемо 1 разпрос в 1 секунд.

Автор: G0rinich 18.9.2006, 13:42
Ну что за глупости.
Зачем использовать регулярные выражения?
Чем вам split() (он же explode()) не угодил?

split() имеет не 2, а 3 параметра!!!
Цитата(Aliance @  20.5.2005,  22:14 Найти цитируемый пост)
в значении могут быть пробелы
в значении могут быть знаки =
в значении может ничего не быть
в значении могут быть спецсимволы/кириллица/латиница/Юникод


Код

$str=array(
    'param=123',
    'param=   123',
    'param =  123',
    'param=флывар',
    'param=1=2=3',
    'param= 1= 2 = 3',
    'param=',
    'param=СЋРЅРёРєРѕРґ', //utf-8
    );

foreach ($str as $val) print_r(split(' *= *', $val, 2));


По-моему все предусмотрел. И никаких огромных регов ;)

Автор: G0rinich 18.9.2006, 14:06
Цитата(Aliance @  20.5.2005,  22:14 Найти цитируемый пост)
if(!function_exists('file_get_contents')) {
   function file_get_contents($file) {
       $file = file($file);
       return !$file ? false : implode('', $file);
   }
}

$infoText = file_get_contents('http://...........');

$lists = explode("\n", $infoText);


Идиотизм!!!
file_get_contents() отличается от file() только тем, что возвращает содержимое файла одной строкой.

По сути код звучит так:
Код

Если (нет ф-ии file_get_contents) {
    загружаем файл с помощью file
    склеиваем полученный массив в одну строку
}
иначе загружаем файл одной строкой

разбиваем файл на строчки


Где блин логика?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)