Autor Zpráva
capricorn76
Profil *
Dobrý den,

pro funkci list() potřebuji z řetezce vytvořit proměnny a dosadit je to té funkce.
Když udělám níže uvedenou bláznovinu, tak to hodí fatal.

$info = array('coffee', 'brown', 'caffeine');
$a = '#';
$b = '$';
$c = '#drink, #color, #power';
list(str_replace($a, $b, $c)) = $info;
echo "$drink is $color and $power makes it special.\n";
Tori
Profil
1. list není funkce, byť tak vypadá
2. do list se nic nedosazuje, naopak list dosazuje hodnoty z pole do zadaných proměnných.
3. z předchozích dvou vyplývá, že v list nemůžete použít žádné výrazy, volání funkcí, literály apod., jen proměnné.

Odkud čtete ty řetězce "#proměnná"?
capricorn76
Profil *
Tori:
Teď to zkouším. Budu je načítat z databáze.
Joker
Profil
capricorn76:
A proč ne úplně jednoduše:
echo "$info[0] is $info[1] and $info[2] makes it special.\n";
capricorn76
Profil *
Joker:
Takto jednoduše to nepůjde, protože hodnoty z polí, které budu zase ukládat pro další zpracování mají vždycky různé klíče a já se k nim tímto způsobem nedostanu.
Joker
Profil
capricorn76:
Tak jsou dvě možnosti: Buď dokážete identifikovat, která položka z pole se má vypsat, nebo ne.
Pokud ano, půjde to udělat zhruba v tom stylu jak jsem napsal.
Pokud ne, nepůjde to udělat vůbec.
Tori
Profil
Spíš bych to řešila přes pole:
$hodnoty = array('coffee', 'brown', 'caffeine');
$db = '#drink, #color, #power';
preg_match_all('~(?<=\b)\w+(?=\b)~', $db, $klice);
$pole = array_combine($klice[0], $hodnoty);
echo "$pole[drink] is $pole[color] and $pole[power] makes it special.\n";

edit: Na rozdíl od konstrukce list ale array_combine vyžaduje, aby byl shodný počet klíčů a hodnot. Pokud to nemůžete zajistit, musela by se přidat kontrola, jestli se shoduje počet prvků v polích $klice[0] a $hodnoty, a podle toho buď zkrátit pole klíčů nebo doplnit prázdné řetězce do $hodnoty.
SeparateSK
Profil
<?php
    class Premenne{
        public $__premenne; //premenna bude neskor pouzita na prekonvertovanie $Class->... len na $...
        function Premenne($a,$b,$c,$d){
            $this->__premenne=array();
            $e=str_replace($a,$b,$c); //mena premennych
            $f=explode(", ",$e); //array nazvov premennych
            foreach($f as $i=>$v){
                $this->{substr($v,1)}=$d[$i]; //vytvori novu public premennu
                $this->__premenne[]=substr($v,1);
            }
        }
    }
    $info = array('coffee', 'brown', 'caffeine');
    $a = '#';
    $b = '$';
    $c = '#drink, #color, #power';
    $Data=new Premenne($a,$b,$c,$info); //vytvorenie objektu Premenne
    foreach($Data->__premenne as $i=>$v) 
        ${$v}=$Data->$v; //prekonvertovanie $Data->... len na $..., teda $Data->drink => $drink
    echo "$drink is $color and $power makes it special.\n";
?>
Tento script vytvori triedu Premenne a tá asi logicky bude obsahovať premenné.
Potom
    foreach($Data->__premenne as $i=>$v) 
        ${$v}=$Data->$v;
prekonvertuje $Data->... len na $... (teda bez $Data->)
Vytvorené premenné budú lokálne, nie globálne.

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: