powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Использование статических переменных.
13 сообщений из 13, страница 1 из 1
(PHP) Использование статических переменных.
    #32971378
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли принудительно инициализировать значение статической переменной перед каждым последующим вызовом функции, в к-рой она (переменная) объявлена?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
<?
	/*
		static.php
	*/

$array = array();

// просто вырезает части слова и заталкивает их в массив (рекурсивная функция)
function foo($str, $pos= 0 )
{
   global $array;
   
   static $count =  0 ;				// начальное значение индекса в массиве $array

   if ($pos>strlen($str)) {			// условие выхода из рекурсии
   		return;
   }
   $array[$count++] = substr($str, $pos++);	// заносим в массив
   
   foo($array[$count- 1 ], $pos+ 1 );		// рекурсия
}

// Первый вызов
print "<br>";
// инициализация $counter начинается с  0 
foo("hello world");

foreach($array as $key=>$substr)
{
	print "$key => $substr <br>";
}

// сделаем повторный вызов функции foo в этом скрипте
$array = array();
print "<br>";
// инициализация $counter начинается с последнего значения предыдущего вызова функции
// как принудительно заставить статическую переменную $counter стартовать опять с  0 ?
foo("this is test message");

foreach($array as $key=>$substr)
{
	print "$key => $substr <br>";
}

?>

Выводит:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 0  => hello world 
 1  => llo world 
 2  => world 

 3  => this is test message 
 4  => is is test message 
 5  => s test message 
 6  => message 
 7  => 

А хотелось бы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 0  => hello world 
 1  => llo world 
 2  => world 

 0  => this is test message 
 1  => is is test message 
 2  => s test message 
 3  => message 
 4  => 

Как можно сделать, чтобы значение переменной $counter всегда инициализировалось с нуля, если функция вызывается из вне?

P.S. просьба не отсылать почитать мануал, уже читал... :)
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971444
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть пример в мануале, в к-ром грится, что если передавать, значение статичной переменной по ссылке, то она не будет сохранятся при последующем вызове функции.
Но че-то у меня такой фокус не проходит, выдается ошибка.

http://www.php.net/manual/ru/language.variables.scope.php
Аналогично ведет себя и выражение static. Ссылки не хранятся статично:
...
Этот пример демонстрирует, что при присвоении ссылки статической переменной она не запоминается, когда вы вызываете функцию &get_instance_ref() во второй раз.


Но как тогда сделать, чтобы в рекурсивном вызове значение сохранялось, а во внешнем нет?
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971460
Comiljou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда трудно представить зачем эта функция нужна... Ну да ладно.
А чего ты так прицепился к этой статической переменной? Она на то и статическая что бы сохранять свое значение между вызовами.

Что тебе мешает сделать так:

function foo($str, $pos=0)
{
global $array;
if ($pos>strlen($str)) {
return;
}
$array[] = substr($str, $pos++);
foo($array[count($array)-1], $pos+1);
}
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971514
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ComiljouМда трудно представить зачем эта функция нужна... Ну да ладно.
А чего ты так прицепился к этой статической переменной? Она на то и статическая что бы сохранять свое значение между вызовами.

Что тебе мешает сделать так:

function foo($str, $pos=0)
{
global $array;
if ($pos>strlen($str)) {
return;
}
$array[] = substr($str, $pos++);
foo($array[count($array)-1], $pos+1);
}
Да мне эта функция нах.. не нужна. Проблема-то не в этой функции.

Просто надо как-то придумать, чтобы инициализация переменной вне функции всегда срабатывала, а внутри функции (когда делается рекурсия), крутился счетчик.

Такой вариант не подходит, т.к. надо чтобы при выходе из рекурсии функция возвращалась к предыдущему своему вызову.
Код: plaintext
1.
2.
3.
4.
5.
6.
function foo($count= 0 )
{
	//
	foo($count+ 1 ); // не подходит
	//
}
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971515
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
BerkutМожно ли принудительно инициализировать значение статической переменной перед каждым последующим вызовом функции, в к-рой она (переменная) объявлена?Статические переменные не предназначены для этого. Вам они не нужны.
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971524
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
BerkutПросто надо как-то придумать, чтобы инициализация переменной вне функции всегда срабатывала, а внутри функции (когда делается рекурсия), крутился счетчик.

Такой вариант не подходит, т.к. надо чтобы при выходе из рекурсии функция возвращалась к предыдущему своему вызову.Так он и крутится.
PS: гадание на кофейной гуще рекомендую делать на сайтах, посвящённых этому надувательству, а не на форумах по программированию.
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971544
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* BerkutМожно ли принудительно инициализировать значение статической переменной перед каждым последующим вызовом функции, в к-рой она (переменная) объявлена?Статические переменные не предназначены для этого. Вам они не нужны.
Хорошо... ваш вариант (если на самом деле нужно :) ):
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971557
Comiljou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Че-то я нифига не понял.
Может тебе просто что-то типа этого надо
$array = array();

function foo($str, $pos=0)
{
global $array,$count;

....

print "<br>";
$count = 0;
foo("hello world");
foreach($array as $key=>$substr)
{
print "$key => $substr<br>";
}

$array = array();
$count = 0;
print "<br>";
foo("this is test message");
foreach($array as $key=>$substr)
{
print "$key => $substr <br>";
}
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971568
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
BerkutХорошо... ваш вариант (если на самом деле нужно :) ):По моему, я уже дал понять, что я не гадаю на кофейной гуще.
Выше вы привели какой-то код, после чего сделали заявление
> Да мне эта функция нах.. не нужна.
Извините, но пока не будет поставлена реальная задача - говорить о путях её решения не имеет смысла.
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971590
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не могу понять, что функция должна делать?...
Может я с похмелья в Пн торможу... но для тех, кто вылез из танка, ТЗ для функции... Когда задаю себе вопрос: "Зачем здесь статическая переменная?" мой больной мозг вообще начинает кипеть...;)

----------------------------------------
Артисты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971745
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спешиал фо *

Тестовые данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create table t(
 id int,
 name varchar( 255 ),
 pid int);

insert into t values('1', 'Программирование', '0');
insert into t values('2', 'Новости', '0');
insert into t values('3', 'Спорт', '0');
insert into t values('4', 'Разное', '0');

insert into t values('5', 'PHP', '1');
insert into t values('6', 'Perl', '1');
insert into t values('7', 'Delphi', '1');

insert into t values('8', 'Криминал', '2');

insert into t values('9', 'Футбол', '3');
insert into t values('10', 'Шахматы', '3');

insert into t values('11', 'Медицина', '4');
insert into t values('12', 'Экология', '4');
insert into t values('13', 'Промышленность', '4');

insert into t values('14', 'PEAR', '5');
insert into t values('15', 'Металлургия', '13');
insert into t values('16', 'Морги', '11');

Скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
<?
/*
	Требуется построить дерево и занести его в массив
*/
$link = mysql_connect('localhost', 'user', '1111') or die ('can\'t connect!');

mysql_select_db('test') or die('can\'t select db!') ;

$tree = array(array());		// Хранит дерево в массиве
$path = array();			// хранит путь для прохода по дереву

// вывести поддерево c раскрытой веткой до записей, родителем которых является PHP
$path = array( 0 ,  1 ,  5 );
build();
printT();

print "<hr>";
$tree = array(array());

// вывести поддерево c раскрытой веткой до записей, родителем которых является ПРОМЫШЛЕННОСТЬ
$path = array( 0 ,  4 ,  13 );
build();		// вызываем второй раз, индексация tree[][] начинается c  7  (неверно)
printT();


// строит дерево
function build($i= 0 )
{
		global $tree;
		global $path;
		
		static $counter =  0 ;
		
		$r = mysql_query(sprintf("select id, name, pid from t where pid='%s'", $path[$i]));
		
		while($row=mysql_fetch_array($r))
		{
			$tree[$counter]['id'] = $row['id'];
			$tree[$counter]['name'] = $row['name'];
			$tree[$counter]['pid'] = $row['pid'];

            $counter++;

			if (isset($path[$i+ 1 ]) && $row['id']==$path[$i+ 1 ]) {
				build($i+ 1 );
			}
		}
		return;
}

// выводит дерево
function printT()
{
	global $tree;
	
        if (empty($tree)) {
            return;
        }
        
        foreach($tree as $key=>$record)
        {
            print "$key:   ";
			print_r($record);
			print "<br>";
        }
}
?>

Выход:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 0 : Array ( [id] =>  1  [name] => Программирование [pid] =>  0  ) 
 1 : Array ( [id] =>  5  [name] => PHP [pid] =>  1  ) 
 2 : Array ( [id] =>  14  [name] => PEAR [pid] =>  5  ) 
 3 : Array ( [id] =>  6  [name] => Perl [pid] =>  1  ) 
 4 : Array ( [id] =>  7  [name] => Delphi [pid] =>  1  ) 
 5 : Array ( [id] =>  2  [name] => Новости [pid] =>  0  ) 
 6 : Array ( [id] =>  3  [name] => Спорт [pid] =>  0  ) 
 7 : Array ( [id] =>  4  [name] => Разное [pid] =>  0  ) 

--------------------------------------------------------------------------------
 0 : Array ( ) 
 8 : Array ( [id] =>  1  [name] => Программирование [pid] =>  0  ) 
 9 : Array ( [id] =>  2  [name] => Новости [pid] =>  0  ) 
 10 : Array ( [id] =>  3  [name] => Спорт [pid] =>  0  ) 
 11 : Array ( [id] =>  4  [name] => Разное [pid] =>  0  ) 
 12 : Array ( [id] =>  11  [name] => Медицина [pid] =>  4  ) 
 13 : Array ( [id] =>  12  [name] => Экология [pid] =>  4  ) 
 14 : Array ( [id] =>  13  [name] => Промышленность [pid] =>  4  ) 
 15 : Array ( [id] =>  15  [name] => Металлургия [pid] =>  13  ) 
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971784
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
Во-первых, код (такой большой) никто не спрашивал, во-вторых, counter вам там не нужен вообще.
Код: plaintext
$tree[] = $row;
Вообще код какой-то неправильный, имхо. Думать, как правильнее, под конец рабочего дня лениво :)
...
Рейтинг: 0 / 0
(PHP) Использование статических переменных.
    #32971809
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*Во-первых, код (такой большой) никто не спрашивал, во-вторых, counter вам там не нужен вообще.
Код: plaintext
$tree[] = $row;
Вообще код какой-то неправильный, имхо. Думать, как правильнее, под конец рабочего дня лениво :)

Пасибо, *. Навел на мысли... если будут ишо идеи (как правильнее), то очень буду рад.
Согласен с тем, что код можно сделать еще лучше, но ... что пока есть, тем и пользуюсь.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Использование статических переменных.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]