Autor Zpráva
snazimse
Profil
Zdravím,

mám takový menší problém.
Mám obyč.funkci bez oop.

Potřeboval bych v return vrátit,celé pole,abych si ho přebral v jiné funkce.
Bohužel se mi to nedaří,protože return vrátí jen první hodnotu pole.
Zkoušel jsem hledat na internetu,ale nic mi nefungovalo.Tam bylo něco s funkcí list,ale tam bych musel jednotlivě,nějak vypsat hodnotu to je k ničemu.

Zkoušel jsem to pak třeba takhle viz příklad,že jsem tam přiřadil pole:Ale to vrací nesmysly.Samozřejmě lze to získat přes echo,print.
Ale to se mi pak hned vypíše,a já to potřebuji jen jako hodnotu uloženou pak do statement.

Jak to vyřešit? Děkuji!

    

  function Testing () {
    $array = array("1","2","3");
    foreach ($array as $key => $value) {
         $values[] = $value;
         return $values."<br>";
    }
   
}  

  
lionel messi
Profil
A čo takto:

 function Testing () {
    $array = array("1","2","3");
    foreach ($array as $key => $value) {
         $values[] = $value;
    }
   return $values;
}  

Keď to upravíš podľa môjho príkladu, tak
var_dump(Testing()); //vráti komplenté pole

Chyba bola podľa mňa spôsobená tým, že return si mal v cykle foreach, ten začal spracovávať pole, spracoval prvý prvok, ukončil sa returnom a pole $values v tej chvíli bolo tvorené jediným prvkom, keďže ďalší prechod cyklom ani neprebehol. (Možno to technicky nevysvetľujem na 100% správne, lepšie viď [#3] Kubo2)
Kubo2
Profil
snazimse:
Nedarí sa ti to preto, lebo si príkaz return umiestnil do cyklu foreach. Ten sa vykoná prvý raz, do $values priradí prvú hodnotu poľa a vzápätí return ukončí ďalšie vykonávanie tela funkcie („vráti“ volanie funkcie, tj. odoberie ju zo zásobníka volaní — call stack; alebo inak povedané vráti sa z funkcie). Tým ukončí aj cyklus a preto pozoruješ to, čo pozoruješ. Skús kód napísať asi tak, ako zmienil lionel messi — [#2].


Reagujem na lionela messiho:
//vráti komplenté pole
Kompletné. :-)
snazimse
Profil
lionel messi, Kubo2:

Ano ve var_dump mi to skutečné nějaké pole vrátí.

Ovšem nemohu z něj dostat žádné hodnoty?

Aspoň mi to žádné nevypisuje.
Kubo2
Profil
snazimse:

Dobre, prosím prilož:

1\ Kód, ktorý testuješ.
2\ Výpis var_dump().
3\ Spôsob, akým sa snažíš dostať z toho poľa nejaké hodnoty.
lionel messi
Profil
Kubo2:
Reagujem na lionela messiho:
//vráti komplenté pole
<mimo témy>
+1, po dnešnej „vysoko zábavnej“ prednáške na tému „Akademické čítanie“ už nevnímam.
</mimo témy>

snazimse:
Prístup k poľu vrátenému funkciou je trošku zložitá vec, závisí aj od používanej verzie PHP. Myslím, že v novej prejde:
echo Testing()[1];
snazimse
Profil
Dobře


$next = Testing();
    echo $next[1];
Výpiše mi to písmeno r.
Nevím proč.

var_dump vrací tohle : string(9) "Array"


nebo foreach zase,ten nevrátí nic za hodnotu.

Takhle to mám umístěné v další funkci,kterou vypisuju.

Díky
lionel messi
Profil
snazimse:
Výpiše mi to písmeno r.
Nevím proč.
Odpoveď je o riadok nižšie: var_dump vrací tohle : string(9) "Array". Pri zavolaní echo na pole totiž PHP automaticky pretypuje pole na reťazec a následné volanie vráti 2. písmeno reťazca.

Skús:
$next = Testing();
foreach ($next as $polozka)
{
  echo $polozka;
}
snazimse
Profil
lionel messi:
Bezvýsledně.To už jsem samozřejmě zkoušel jak jsem řekl,nevrátí nic.

Jak to myslíte? viz: Pri zavolaní echo na pole totiž PHP automaticky pretypuje pole na reťazec a následné volanie vráti 2. písmeno reťazca

Ale v tom poli jsou čísla,jak je to možné?
lionel messi
Profil
snazimse:
Ale v tom poli jsou čísla,jak je to možné?
Lebo proste PHP, pretože je to dynamicky typovaný jazyk.

Ešte odpoviem presnejšie: Ono v tom poli čísla sú a v skutočnosti nie sú. Vkladáte ich tam totiž ako reťazce, skutočné čísla (=typovo) by boli, keby neboli v úvodzovkách, viď Nejčastější potíže s PHP (FAQ) » Co dávat a co nedávat do uvozovek.
snazimse
Profil
To jistě,ale.
Respective čísla,jsou tam ale jako stringy,tak by to mělo zase vypsat string.

Přece ne?


Tak co prosím s tím,jak to řešit? Reálně,když to nic nevrátí?

Ve foreach cyklu.


lionel messi:
Jen podotknu,že

function Testing (){
    $array = array("1","2","3");
    
   return $array;
}

Tohle je bez problému.
Kubo2
Profil
snazimse:
Tohle je bez problému.
Samozrejme. Aby som to uviedol na pravú mieru. V implementácii v [#11] vracia funkcia Testing() pole. V [#7] si musel v implementácii urobiť nejakú chybu, kvôli ktorej sa pole pretypovalo na reťazec, a preto ti funkcia Testing() vrátila už rovno reťazec "Array" (viď príklad). (Tu však vyvstáva otázka, ako je možné, že ti var_dump() vypísalo string(9) "Array", keďže slovo Array má iba päť znakov. Takže si v implementácii musel urobiť nejakú hrubšiu chybu.)

Mimochodom, kódom, ktorý testuješ, som v [#5] myslel implementáciu (telo) Testing().

Úprava: Ešte by som poznamenal, že nie je na škodu prečítať si práve vydanú kapitolu o poliach na PéHáPku.

lionel messi:
Pri zavolaní echo na pole totiž PHP automaticky pretypuje pole na reťazec a následné volanie vráti 2. písmeno reťazca.
Nie. Pri volaní funkcií (a používaní príkazov) platí taká vec, ktorá sa nazýva right-hand association. Zjednodušene to znamená, že ak voláš nejakú funkciu a ako argument jej predávaš výraz (resp. volanie inej funkcie), toto volanie sa vyhodnocuje sprava (najprv musíš získať hodnotu z výrazu, aby si ju mohol použiť ako argument).

Čiže pri
$next = testing();
      echo $next[1];
už musel mať snazimse v premennej $next uložený string "Array" ako návratovú hodnotu funkcie Testing(), inak by ním vyššie popísaný výsledok nebol možný.

Myslím, že v novej prejde:
echo Testing()[1];
Prejde od PHP 5.4 a vyššie.
snazimse
Profil
Kubo2:
Děkuji za rady.

Nicméně,kod je pouze takový,jaký jsem zde uvedl.

Nic jiného se tam neděje.

Udělal jsem to jinak,ale na tohle jsem prostě nepřišel.
juriad
Profil
snazimse:
Že ty jsi neodstranil to . "<br>", to jsou čtyři znaky navíc, tedy celkově 9.

Správný postup je:
function Testing () {
    $array = array("1","2","3");
    foreach ($array as $key => $value) { # postupně procházíme pole $array
         $values[] = $value . "<br>"; # tady přidáme do pole $values jeden prvek, který bude číslo a za ním <br>
    }
    return $values; # tady vrátíme pole, které má 4 prvky; každý z nich je řetězec ve formátu číslo a za ním <br>
}  
snazimse
Profil
juriad:

Funguje to,ale funguje mi již i to staré,asi jsem dělal jinou chybu nevím.

Už to neřeším,každopádně,co myslíte tím neodstranil.To se přece neodstraňuje ten html tag br?

Děkuji!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0