Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Как последовательно вычитывать части?


Автор: MyRoot 8.11.2007, 20:32
Подскажите пожалуйста, может вопрос получился глупый...
Но в документациях я не нашел ответа.
Как последовательно вычитывать (fread) части строки разделенные знаком ";" для последующего помещения в переменные?
Пример:

1;10;100; \-- это исходная строка.

В итоге переменные принимают значения:

$simple=1;
$double=10;
$threevalue=100;


Заранее спасибо огромное.

Автор: GZep 8.11.2007, 21:09
http://ru2.php.net/explode

Автор: skyboy 8.11.2007, 21:10
  • самое  короткое решение - через http://php.net/explode. Тем более, что разделитель один и тот же. Правда, так ты получишь на выходе массив, а не набор переменных... Но по моему мнению, чтоб работать унифицированно лучше уж массив, чем набор разноименных переменных.
  • самое мудреное - через http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F: http://php.net/preg_match и регулярное выражение http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
    Код

    ^([^;]*)*$
  • самое прямолинейное и самое простое: цикл + http://php.net/strpos + http://www.php.net/manual/en/function.substr.php
    На самом деле, не рекомендую. Уж больно громоздко и тормознуто.

Автор: SelenIT 8.11.2007, 21:16
Цитата(MyRoot @  8.11.2007,  20:32 Найти цитируемый пост)
Как последовательно вычитывать

http://php.net/strtok?

Но, если я верно догадался, что считываются эти штуковины из файла, то, скорее всего, самое верное решение - http://php.net/fgetcsv.

Цитата(skyboy @  8.11.2007,  21:10 Найти цитируемый пост)
Правда, так ты получишь на выходе массив, а не набор переменных...

Если получен массив, а дальше ну никак без переменных - то http://php.net/list в помощь. Хотя всецело присоединяюсь к
Цитата(skyboy @  8.11.2007,  21:10 Найти цитируемый пост)
чтоб работать унифицированно лучше уж массив, чем набор разноименных переменных.

Автор: GZep 8.11.2007, 21:20
если нужно сделать переменные, то:
Код

$parts = explode(";", "1;10;100;");
$names = array(
    "simple",
    "double",
    "threevalue"
);
for ($i = 0; $i < count($parts); $i++)
    $GLOBALS[(isset($names[$i]) ? $names[$i] : "undefined name"] = $parts[$i];
unset($parts);

Автор: SelenIT 8.11.2007, 21:33
GZep, зачем такая жесть, особенно после моей последней ссылки? С потенциальными конкурентами боремся;) ?

Автор: MyRoot 8.11.2007, 21:53
Круто. Вот это скорость smile)
Не часто такое встретишь. smile)

Большое спасибо всем. Очень помогли.

Vingrad рулит!!!

Автор: MyRoot 8.11.2007, 22:45
А есть ли подобная explode'у  функция, только для строк???

Например txt файл содержит:

string1
string2
string3

А на выходе получается массив $str:

$srt[1]=string1
$srt[2]=string2
$srt[2]=string3



???

Автор: GZep 8.11.2007, 22:57
Цитата(SelenIT @  8.11.2007,  21:33 Найти цитируемый пост)
С потенциальными конкурентами боремся;)

дык, не смотрел, как другие отвечают... и вообще на винграде у меня нет конкурентов, есть только друзья!
Цитата(MyRoot @  8.11.2007,  21:53 Найти цитируемый пост)
Большое спасибо всем. Очень помогли.

спасибо за вопрос
MyRoot, я точно не уверен, но по-моему можно так, попробуй:
Код

$parts = explode("\n", $text);

Автор: flashaa 8.11.2007, 22:59
Цитата(SelenIT @  8.11.2007,  21:16 Найти цитируемый пост)
fgetcsv.

в 4 PHP эта функция присутствует, но работает некорректно.  В точности версию не скажу, но в свое время на 4.х - пхп-шной версии денвера она у меня не работала. Т.е. работала но некорректно и непонятно. Пришлось писать скрипт. О таком же факте позже читал в книге Котерова PHP5.

Цитата(MyRoot @  8.11.2007,  22:45 Найти цитируемый пост)
А есть ли подобная explode'у  функция, только для строк???

Дык функция разбивает по разделителю. Задайте разделитель в виде символа переноса строки и все то же самое.

Код

$string = explode("\r\n", $string); // Для windows-файла
$string = explode("\n", $string); // Для unix-файла


А можно универсально:

Код

$string = explode("\n", $string);
array_walk($string, 'trim');

Автор: SelenIT 9.11.2007, 00:36
Цитата(GZep @  8.11.2007,  22:57 Найти цитируемый пост)
вообще на винграде у меня нет конкурентов, есть только друзья!

GZep, сорри, не имел в виду ничего плохого, просто приведенная конструкция через, гм... $GLOBALS показалась мне несколько странной по сравнению с
Код
list($simple, $double, $threevalue) = explode(";", "1;10;100;");

 smile 

Цитата(flashaa @  8.11.2007,  22:59 Найти цитируемый пост)
работает некорректно

flashaa, это случайно не про http://bugs.php.net/bug.php?id=12127 древнейший баг? Надо же, никак не мог представить, что он еще хоть как-то актуален. Впрочем, судя по комментам, в актуальных версиях проблема решается настройкой локали, а адекватная локаль в любом случае рано или поздно понадобится...

Цитата(flashaa @  8.11.2007,  22:59 Найти цитируемый пост)
А можно универсально:

Легко. В качестве альтернативного варианта -
Код

$strings = explode("\n", str_replace("\r", "", $string)); // древние маки в расчет не берем ;)



MyRoot, а вообще озвучили бы Вы конечную цель этих операций - может, совместными усилиями коллективного разума;) мы предложили бы более короткое/эффективное решение...

Автор: MyRoot 9.11.2007, 02:20
Еще и еще раз спасибо всем за уделённое время !!!!

Вот что получилось в итоге:

Код


<?php

$file = fopen("file.txt","r");
      if(!file)
        {
          echo("Ошибка открытия файла.");
        }
        else
        {
         $allcontent = fread ($file,2400);
         $string = explode("\n", str_replace("\r", "", $allcontent));
         $row_0 = explode(";", $string[0]);
         $row_2 = explode(";", $string[2]);
         echo ("$row_0[0]-- первый кусок до разделителя ';', от первой строки файла ");
         echo ("$row_0[3]-- четвёртый кусок до разделителя ';', от первой строки файла ");
         echo ("$row_3[0]-- первый кусок до разделителя ';', от третьей строки файла ");
        }

?>


По сути нужен был доступ к каждой псевдо ячейке из псевдо таблицы в файле вида:

1a;1b;1c;1e
2a;2b;2c;2e

Не знаю на сколько это актуально в современном мире, но задача была имеено такая ;)))

Автор: GZep 9.11.2007, 20:25
Цитата(SelenIT @  9.11.2007,  00:36 Найти цитируемый пост)
GZep, сорри, не имел в виду ничего плохого, просто приведенная конструкция через, гм... $GLOBALS показалась мне несколько странной по сравнению с

точно... то, что я написал можно сделать одной функцией - http://ru2.php.net/manual/ru/function.extract.php.

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