Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не видно массив внутри функции 
V
    Опции темы
Burka
Дата 29.8.2010, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Пишу инклуд файл с функцией, которая парсит xml файл с помощью стандартных функций. 
В моей функции описано три функции которые выполняются переодически при обходе файла xml.
Проблема в том что переменную $nicks_arr в функции characterData не видно, хотя переменные $i и $tmp_state_name видно. 

Код

26: print $tmp_state_name.' '.$data."  $i  <br>";

Эта строчка выводит все правильно. То есть все данные присутствуют.

Код

function GetTopStats($file)
{
$nicks_arr = array(array()); //описание двухмерного массива
$tmp_state_name = '';
$i = 0;

//Функция выполняется первой
function startElement($parser, $name, $attrs) {
    global $tmp_state_name;
    global $i;
    if($attrs['NAME']!='') {
        $tmp_state_name = $attrs['NAME'];
        if ($attrs['NAME']=='nickname') {$i++;}
        //echo $attrs['NAME'];
    }
}

//Функция выполняется второй
function characterData($parser, $data) {
    global $tmp_state_name;
    global $i;
    global $nicks_arr;
    

    if (trim($data)!='') {
        print $tmp_state_name.' '.$data."  $i  <br>";
        $nicks_arr[$i]["$tmp_state_name"] = $data;
        //echo " >>>> ".$data.'<br>';
        }
}

//Функция выполняется третьей
function endElement($parser, $name) {
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
print_r($nicks_arr);
}



--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
enoff
Дата 29.8.2010, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: 11
Всего: 13



$nicks_arr объявляется в функции, поэтому область видимости массива ограничена функцией GetTopStats()
Код

function GetTopStats($file)
{
global $nicks_arr;
$nicks_arr = array(array());
//...



PM MAIL ICQ Skype GTalk   Вверх
Burka
Дата 29.8.2010, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Спасибо, не думал что Global Везде где только можно писать нужно  smile 


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Muerto
Дата 29.8.2010, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



У указателями редко пользуюсь , поэтому могу вам сказать не правильно
но стоит проверить вариант с указателем 
Код

 function GetTopStats($file,&$nicks_arr)
{




--------------------
user posted image
PM MAIL   Вверх
gta4kv
Дата 29.8.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Цитата(Burka @ 29.8.2010,  06:50)
Спасибо, не думал что Global Везде где только можно писать нужно  smile

Этого делать не надо, global — это плохо. Его не должно быть вовсе.

Добавлено @ 11:18
enoff, shame on you! smile 

Это сообщение отредактировал(а) gta4kv - 29.8.2010, 11:18
PM MAIL   Вверх
enoff
Дата 29.8.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: 11
Всего: 13



вопрос был в том, почему не видно переменную smile 
Цитата(gta4kv @  29.8.2010,  12:17 Найти цитируемый пост)
Его не должно быть вовсе.

в callback функциях удобно использовать... smile 
PM MAIL ICQ Skype GTalk   Вверх
gta4kv
Дата 29.8.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Цитата(enoff @ 29.8.2010,  12:02)
в callback функциях удобно использовать... smile

Этого делать не надо © gta4kv;
PM MAIL   Вверх
bars80080
Дата 29.8.2010, 12:47 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(gta4kv @  29.8.2010,  12:20 Найти цитируемый пост)
Этого делать не надо

меня эти "не надо" всегда расстраивали своей не информативностью. а как же тогда иначе? надо предлагать вариант.

что касается самого "не надо", пока человеку не объяснишь (желательно кратко и ёмко), он не воспримет. почему не надо?

поводу этого не надо:

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

как я понимаю, здесь добавления простого return $array; вполне хватит
PM MAIL WWW   Вверх
gta4kv
Дата 29.8.2010, 13:50 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



bars80080, я не теоретик.

Добавлено через 10 секунд
умные длинные посты писать не умею
PM MAIL   Вверх
Burka
Дата 30.8.2010, 09:42 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата(bars80080 @  29.8.2010,  12:47 Найти цитируемый пост)
Цитата(gta4kv @  29.8.2010,  12:20 Найти цитируемый пост)
Этого делать не надо

меня эти "не надо" всегда расстраивали своей не информативностью. а как же тогда иначе? надо предлагать вариант.

что касается самого "не надо", пока человеку не объяснишь (желательно кратко и ёмко), он не воспримет. почему не надо?

поводу этого не надо:

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

как я понимаю, здесь добавления простого return $array; вполне хватит 

Это все хорошо и я все понимаю, но в данном случае без глобальной переменной не обойтись, так как количество аргументов у функций четко определено и данные из одной функции не перенести в другую другим способом. И вообще функции разные бывают и не обязательно она должна быть совершено самостоятельной.


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
gta4kv
Дата 30.8.2010, 12:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Без глобальной переменной можно обойтись абсолютно в любой ф-ции. Не вижу помех, для того, что бы передать $nicks_arr как параметр ф-ции.

Это сообщение отредактировал(а) gta4kv - 30.8.2010, 12:18
PM MAIL   Вверх
Burka
Дата 1.9.2010, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата

gta4kv  
Дата 30.8.2010, 12:17
    
Без глобальной переменной можно обойтись абсолютно в любой ф-ции. Не вижу помех, для того, что бы передать $nicks_arr как параметр ф-ции.


Если захочешь еще сказать что глобальная переменная не нужна, напиши работающий код с использованием xml_set_element_handler в которую передается функция с четырьмя параметрами.

Цитата

bool xml_set_element_handler (resource parser, string start_element_handler, string end_element_handler)

Устанавливает функции обработчиков для XML-разборщика parser.
start_element_handler и end_element_handler это строки, содержащие имена функций, которые обязаны существовать в при вызове xml_parse() для parser.

Функция start_element_handler обязана принимать три параметра: start_element_handler (resource parser, string name, array attribs)


Это сообщение отредактировал(а) Burka - 1.9.2010, 09:22


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
gta4kv
Дата 1.9.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



В чем проблемы, не пойму?

Добавлено @ 12:02
Бред вообще несешь. Никакой функции не нужен global, что бы работать. А своё неумение не надо скидывать на «Если захочешь еще сказать что глобальная переменная не нужна, напиши работающий код».

Это сообщение отредактировал(а) gta4kv - 1.9.2010, 12:02
PM MAIL   Вверх
Burka
Дата 1.9.2010, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата

Бред вообще несешь. Никакой функции не нужен global, что бы работать. А своё неумение не надо скидывать на «Если захочешь еще сказать что глобальная переменная не нужна, напиши работающий код».

Но вразумительного ответа как обойтись в данном примере без глобал я так и не получил. 


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
skyboy
Дата 1.9.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Burka, можно использовать анонимные функции(начиная с версии 5.3.0) или create_function, чтоб получилось что-то вроде:
Код

$localArray = array(1, 2, 3);
xml_set_element_handler($parser, function($parser, $name, $attributes) use ($localArray) {
  return youBigFunctionWith4Args($parser, $name, $attributes, $localArray);
});

можно вместо функции передавать метод.
Код

class Test {
 private $ar;
 public function __construct($array) {
   $this->ar = $array;
 }
 public function callback($parser, $name, $attributes) { 
  // используется $this->ar
 }
}
$obj = new Test($mySuperArray);
xml_set_element_handler($parser, array($obj, 'callback'), ...);


Добавлено через 5 минут и 34 секунды
причем, лично я за вариант с объектом и методом. потому что гибче и понятнее.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.