по гуглу ответов не найду потому нужна помощь специалистов)
есть функция (в функции есть рекурсия),как вернуть из этой функции массив в который в функции присваиваются значения???
всевозможные комбинации переменных static
і global не помогают
$vs='-3x^2+x^3-1';
$masslag[0]=0;
$masslag[1]=0;
fslag($vs);
//echo fslag($vs);
$masslagg= fslag($vs);
echo $masslagg[1];
function fslag($vs)
{
//' находит слагаемые в строке
// $masslag[10];
global $ii;
$ii=$ii;
static $ii;
//static $ostsl='';
//echo (strpos($vs, "+",2));
if ($vs=='') { exit;}
if (!strpos($vs, "+",2)) {$ps=0;}
else {
$ps = strpos($vs, "+",2);}
if (!strpos($vs, "-",2)) {$psl=0;}
else {
$ps1 = strpos($vs, "-",2);
}
$sum=$ps+$ps1;
if ($sum == 0)
{
//return $vs;
$fslag= $vs;
$ps2 = strlen($fslag) + 1;
}
else
{
if (($ps == 0) and ($ps1 <> 0))
{
$ps2 = $ps1;
}
else
{
if (($ps <> 0) and ($ps1 == 0))
{
$ps2 = $ps;
}
else
{
if ($ps < $ps1)
{
$ps2 = $ps;
}
else
{
$ps2 = $ps1;
}
}
}
}
//}
$fslag = substr($vs, 0, $ps2 );
$ostsl = substr($vs, $ps2, strlen($vs) - $ps2 + 1);
//static $masslag[$ii];
$masslag[$ii] = $fslag;
//echo '<p>'.$masslag[$ii].'</p>';
$ii = $ii + 1;
if ($fslag <> $ostsl)
{
fslag($ostsl);
}
else
{
if (strlen($ostsl) > 0)
{
fslag($ostsl);
}
}
return $masslag;
}
Спустя 1 час, 55 минут, 8 секунд (15.10.2010 - 20:35) sergeiss написал(а):
"Обычно" массив возвращается через return
А что у тебя происходит?
Вообще, тебе надо внутри функции объявить этот массив до того, как начать его использовать. Всяко лучше будет.

Вообще, тебе надо внутри функции объявить этот массив до того, как начать его использовать. Всяко лучше будет.
$masslag=array(); // где-то в начале функции
Спустя 12 минут, 18 секунд (15.10.2010 - 20:47) sl-avik написал(а):
sergeiss внутри функции массив корректно отрабатывается и построчно через echo выдает то что надо,
вкратце так т.е. ни ошибок ничего вообще не выводит
вкратце так т.е. ни ошибок ничего вообще не выводит
$masslagg= fslag($vs);
echo $masslagg[1];// а тут ничего вообще пусто!!!
function fslag($vs)
{
$masslag=array();
static $ii;
//...
$masslag[$ii] = $fslag;
//echo '<p>'.$masslag[$ii].'</p>';// тут все что надо выводит на экран
//...
return $masslag;
}
Спустя 7 минут, 48 секунд (15.10.2010 - 20:55) sergeiss написал(а):
Вместо вот этого
Цитата (sl-avik @ 15.10.2010 - 21:47) |
$masslagg= fslag($vs); echo $masslagg[1];// а тут ничего вообще пусто!!! |
попробуй лучше так:
$masslagg= fslag($vs);
var_dump( $masslagg );
Я не вникал в логику функции, но возможно, что там просто не образуется элемент с индексом 1. Через вар_дамп ты увидишь весь массив, даже не зная, что у тебя в нем есть.
Спустя 19 минут, 1 секунда (15.10.2010 - 21:14) sl-avik написал(а):
sergeiss
ничего не выдает - пусто
если внутри функции var_dump ($masslag); то
array(1) { [""]=> string(5) "-3x^2" } array(1) { [1]=> string(4) "+x^3" } array(1) { [2]=> string(2) "-1" }
а ниже то что должно быть по задумке
-3x^2
+x^3
-1
$masslagg= fslag($vs);
var_dump( $masslagg );
ничего не выдает - пусто
если внутри функции var_dump ($masslag); то
array(1) { [""]=> string(5) "-3x^2" } array(1) { [1]=> string(4) "+x^3" } array(1) { [2]=> string(2) "-1" }
а ниже то что должно быть по задумке
-3x^2
+x^3
-1
Спустя 11 минут, 3 секунды (15.10.2010 - 21:25) sergeiss написал(а):
Я тут попытался вникнуть в твою функцию и вот чего не понял:
Это как? Оно глобальное или всё-таки статичное? И что за присвоение "самому себе"?
К тому же, ты вызываешь функцию fslag дважды!!! Это правильно?
Короче говоря. Разберись с логикой того, что ты хочешь получить.
global $ii;
$ii=$ii;
static $ii;
Это как? Оно глобальное или всё-таки статичное? И что за присвоение "самому себе"?
К тому же, ты вызываешь функцию fslag дважды!!! Это правильно?
Короче говоря. Разберись с логикой того, что ты хочешь получить.
Спустя 6 минут, 1 секунда (15.10.2010 - 21:31) sl-avik написал(а):
sergeiss сейчас все лишнее уберу я эти строки комментил потом но толку нету (так скорей уже перебирая все что можно придумать((
$vs='-3x^2+x^3-1';
$masslagg=array();
$masslagg= fslag($vs);
var_dump($masslagg);
function fslag($vs)
{
//' находит слагаемые в строке
$masslag=array();
static $ii;
if ($vs=='') { exit;}
if (!strpos($vs, "+",2)) {$ps=0;}
else {
$ps = strpos($vs, "+",2);}
if (!strpos($vs, "-",2)) {$psl=0;}
else {
$ps1 = strpos($vs, "-",2);
}
$sum=$ps+$ps1;
if ($sum == 0)
{
$fslag= $vs;
$ps2 = strlen($fslag) + 1;
}
else
{
if (($ps == 0) and ($ps1 <> 0))
{
$ps2 = $ps1;
}
else
{
if (($ps <> 0) and ($ps1 == 0))
{
$ps2 = $ps;
}
else
{
if ($ps < $ps1)
{
$ps2 = $ps;
}
else
{
$ps2 = $ps1;
}
}
}
}
$fslag = substr($vs, 0, $ps2 );
$ostsl = substr($vs, $ps2, strlen($vs) - $ps2 + 1);
$masslag[$ii] = $fslag;
$ii = $ii + 1;
if ($fslag <> $ostsl)
{
fslag($ostsl);
}
else
{
if (strlen($ostsl) > 0)
{
fslag($ostsl);
}
}
return $masslag;
}
Спустя 17 минут, 19 секунд (15.10.2010 - 21:48) sergeiss написал(а):
Я понял!!!!! 
Замени exit внутри функции на return и всё заработает
И больше никогда не делай выход из скрипта таким образом.
PS. Но только учти, что твоя функция может отработать только один раз. Потому что в ней используется статичная переменная, которую ты не можешь ресетнуть.

Замени exit внутри функции на return и всё заработает

PS. Но только учти, что твоя функция может отработать только один раз. Потому что в ней используется статичная переменная, которую ты не можешь ресетнуть.
Спустя 4 минуты, 36 секунд (15.10.2010 - 21:53) sl-avik написал(а):
sergeiss СПАСИБО!!! заработало!!
я бы на него точно не обратил внимания



Спустя 5 месяцев, 29 дней, 12 часов, 51 минута, 29 секунд (15.04.2011 - 10:44) entroika написал(а):
Та же проблема. Нужно вернуть массив из функции. Ситуация примерно такая
В докухе нашел следующее:
class B {}
class A {
function getArray(){
$arr = array();
$obj = new B();
$arr[]=$obj;
// Здесь is_array($arr) выдаст TRUE
return $arr;
}
}
//
$objA = new A();
$myArray = $objA->getArray();
/* Здесь is_array($myArray) выдаст FALSE
* а мне нужен $myArray массив!!
В докухе нашел следующее:
Цитата |
# (5) You have to force pass by reference and return by reference on arrays |
Подход как в С/С++, но не хотелось бы передавать ссылку на массив чтоб функцией его заполнять. Если нет другого выхода, придется конечно сделать так но может все-таки у кого есть более удобное решение. Буду признателен.