Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Программирование на PHP

  Все выпуски  

RFpro.ru: Программирование на PHP


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

vladisslav
Статус: 6-й класс
Рейтинг: 1236
∙ повысить рейтинг »
amnick
Статус: Профессионал
Рейтинг: 1137
∙ повысить рейтинг »
Палян Александр Михайлович
Статус: 6-й класс
Рейтинг: 309
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / PHP

Номер выпуска:1213
Дата выхода:04.08.2010, 13:00
Администратор рассылки:Устинов С.Е., Профессионал
Подписчиков / экспертов:333 / 149
Вопросов / ответов:1 / 4
IRC-канал по теме:#php

Вопрос № 179631: Здравствуйте, уважаемые Эксперты! PHP 5.3.2. Как избавится от ошибки: [29-Jul-2010 16:25:34] PHP Notice: Undefined offset: 1 in C:\www\CheckPeople.php on line 29 Использую следующую конструкцию: list($CEH, $FIO...



Вопрос № 179631:

Здравствуйте, уважаемые Эксперты!

PHP 5.3.2.

Как избавится от ошибки:
[29-Jul-2010 16:25:34] PHP Notice: Undefined offset: 1 in C:\www\CheckPeople.php on line 29

Использую следующую конструкцию:

list($CEH, $FIO, $NumTable) = split('[\;]', $str);


Что делается:

Считываю файл, в котором такие строки:

------------------------------------------------------
Бух;Иванова А.К.;2;
Юр;Кашин К.Р.;4;
....
*********** Комментарии *********
....
Авто;Лемин В.В.;48;
------------------------------------------------------

Получаю ошибки в логе:

[29-Jul-2010 16:25:34] PHP Notice: Undefined offset: 1 in C:\www\CheckPeople.php on line 29

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

Попробовал вставить:

$CEH = null;
$FIO = null;
$NumTable = null;

list($CEH, $FIO, $NumTable) = split('[\;]', $str);


Ошибки всё равно идут :(.
Комментарии удалять тоже не хочется :(
Проверяю что это не строка с комментарием так:

if (strlen($FIO) > 1) {обрабатываю}

P.S. На версии PHP 5.2.6 этих ошибок не было... видимо что-то поменялось в логике PHP...

Спасибо! :)

Отправлен: 30.07.2010, 12:46
Вопрос задал: LanK, Профессионал
Всего ответов: 4
Страница вопроса »


Отвечает Леуткин Дмитрий Николаевич, 2-й класс :
Здравствуйте, LanK.
Если у вас такие данные
$str = 'Авто;Лемин В.В.;48';
то разбивать по переменным надо просто
list($CEH, $FIO, $NumTable) = split(';', $str);

Ответ отправил: Леуткин Дмитрий Николаевич, 2-й класс
Ответ отправлен: 30.07.2010, 15:48
Номер ответа: 262693

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262693 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Отвечает Марк Крейн, 1-й класс :
    Здравствуйте, LanK.

    Попробуйте пожалуйста следующий код:


    list($CEH, ,) = split(';', $str);

    Суть в том, что если у Вас в переменные $FIO и $NumTable не должно ничего записываться, то они и не должны фигурировать в функции list()

    Ответ отправил: Марк Крейн, 1-й класс
    Ответ отправлен: 30.07.2010, 15:54
    Номер ответа: 262694

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262694 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Отвечает Волков Алексей aka Lupo, 5-й класс :
    Здравствуйте, LanK.
    В добавление к первому ответу хочу сказать, что в Вашем случае (без регулярных выражений) правильнее использовать explode(), причём с указанием третьим параметром числа частей (т.е. числа перменных в списке list())
    -----
    Всё, что есть хорошего в жизни - либо незаконно, либо аморально, либо ведёт к ожирению...

    Ответ отправил: Волков Алексей aka Lupo, 5-й класс
    Ответ отправлен: 30.07.2010, 16:01
    Номер ответа: 262695

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262695 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Отвечает Устинов С.Е., Профессионал :
    Здравствуйте, LanK.

    *По просьбе LanK переношу верные ответы из мини-форума

    @PsySex:
    Думаю лучше проверку делать перед list($CEH, $FIO, $NumTable) = split('[\;]', $str);
    Как я понял в "правильной строке" всегда будет содержаться символ ";" , значит и сделайте
    Код:
    if(stripos($str, ";")!== false)
    {
    list($CEH, $FIO, $NumTable) = split(';', $str);
    //и дальше свою обработку
    }

    @dvserg:
    Судя по http://php.su/functions/?split - split может возвращать FALSE, поэтому правильным будет добавить проверку
    Код:
    $a = split('[\;]', $str);
    if ($a !== FALSE )
    {
    # и проверку на количество элементов
    if ( count ( $a ) > 2 )
    list($CEH, $FIO, $NumTable) = $a;
    }

    PS Хотя я бы по такому простому случаю не дергал регулярные выражения, а использовал более быстрый explode вместо split.

    И, наконец, самое лучшее решение по мнению LanK:
    @HookEst:
    Как вариант, просто дополнить недостающие элементы:
    Код:
    l
     ist($CEH, $FIO, $NumTable) = explode(';', $str . ";;;");

    тогда в случае комментария, комментарий будет в первой переменной list, остальные будут с пустой строкой, причем достаточно добавить ";;", т.е.
    Код:
    list($CEH, $FIO, $NumTable) = explode(';', $str . ";;");

    вкратце:
    list требует, чтобы справа стоял массив с количеством элементов не менее чем количество аргументов list
    в данном случае - не менее трех
    если $str = "Бух;Иванова А.К.;2;" - explode(';', $str) вернет массив из 4-х элементов, ошибки нет, первые 3 значения попадут в аргументы list
    если $str = "*********** Комментарии *********" - explode(';', $str) вернет массив из 1-го элементов, что меньше 3-х, отсюда и ошибка добавим ";;":
    explode(';', $str . ";;") (что равносильно explode(";", "Бух;Иванова А.К.;2;;;"))вернет массив из 6-ти элементов, ошибки так же нет, первые 3 значения попадут в аргументы list
    explode(';', $str . ";;") (что равносильно explode(";", "*********** Комментарии *********;;"))вернет массив из 3-х элементов, ошибки нет, первые 3 значения попадут в аргументы list
    -----
    Ждешь квалифицированного ответа? Задай правильно вопрос!

    Ответ отправил: Устинов С.Е., Профессионал
    Ответ отправлен: 03.08.2010, 11:34
    Номер ответа: 262720

    Оценка ответа: 5
    Комментарий к оценке:
    Все три варианта работают, но вариант @HookEst действительно самый "простой" для моего конкретного примера.

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262720 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное