[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как получить массив из функции
sl-avik
Доброе время суток, первый раз на форуме
по гуглу ответов не найду потому нужна помощь специалистов)

есть функция (в функции есть рекурсия),как вернуть из этой функции массив в который в функции присваиваются значения???

всевозможные комбинации переменных 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 smile.gif А что у тебя происходит?

Вообще, тебе надо внутри функции объявить этот массив до того, как начать его использовать. Всяко лучше будет.

$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

$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 написал(а):
Я тут попытался вникнуть в твою функцию и вот чего не понял:
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 написал(а):
Я понял!!!!! smile.gif

Замени exit внутри функции на return и всё заработает smile.gif И больше никогда не делай выход из скрипта таким образом.

PS. Но только учти, что твоя функция может отработать только один раз. Потому что в ней используется статичная переменная, которую ты не можешь ресетнуть.

Спустя 4 минуты, 36 секунд (15.10.2010 - 21:53) sl-avik написал(а):
sergeiss СПАСИБО!!! заработало!! smile.gif
smile.gif smile.gif я бы на него точно не обратил внимания


Спустя 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

function &array_ref_inc_x(&$array) {
    $array{'x'}++;
    return $array;
}



Подход как в С/С++, но не хотелось бы передавать ссылку на массив чтоб функцией его заполнять. Если нет другого выхода, придется конечно сделать так но может все-таки у кого есть более удобное решение. Буду признателен.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.