Autor Zpráva
ng9
Profil
Zdravím,

řeším takovou zapeklitou situaci, kdy potřebuji v poli, kde jsou stringy s proměnnými, aktualizovat proměnné které se deklarují později než samotné pole.

Příklad funkčního řešení:
$pole = array (&$prom);
$prom = "test";
print_r($pole); // pole obsahuje string "test" 

Přesně takhle si to představuji aby to fungovalo, jenže potřebuji k tomu aliasu přiložit ještě string a jakmile to udělám, php vyhazuje chyby a opravdu mne nenapadá jak to zapsat. Nefungují tyto běžné zápisy:

$pole = array ("string".&$prom); // vypisuje chybny zapis
$pole = array ("string".(&$prom)); // vypisuje chybny zapis
$pole = array ("string {&$prom}"); // neinterpretuje jako alias

Víte někdo jak na to? Díky moc za jakékoliv postřehy.
Joker
Profil
ng9:
To nepůjde jednoduše z toho důvodu, že výsledkem operátoru spojení řetězců bude řetězec a hodnota té proměnné musí být známa, aby bylo možné výraz vyhodnotit.

Jinak ale tahle konstrukce je podezřelá, proč jednoduše neposunete pole až za definici proměnné?
ng9
Profil
Chtěl jsem nějakým elegantním způsobem rozšířit web o další jazykové rozhraní a jako nejjednodušší mi přišlo vytvořit pole s texty na které se budu v určitých místech odkazovat a vypisovat. Problém nastal právě v tom, kdy text obsahoval proměnné které byly logicky prázdné právě kvůli obrácené posloupnosti zápisu - proto jsem myslel, že by to mohlo jít elegantně odkazováním a zde jsem narazil.

Další variantou bylo volat pole vždy před vytáhnutím hodnoty aby se přenačetlo ... ale to mi přijde trochu hardcore volat načítání x desítek, možná stovek řádků na x různých místech svým způsobem naprosto zbytečně.


Jinak stejně moc nerozumím proč holý alias funguje, ale ve spojení se stringem ne ... neexistuje na to nějaký "trik" jak by se to dalo protlačit?
Keeehi
Profil
ng9:
<?php
define("LANGUAGE", "cze");

$from = array("dog", "cat", "apple");

$to["eng"] = array("dog", "cat", "apple");
$to["cze"] = array ("pes", "kočka", "jablko");
$to["ger"] = array ("der Hund", "die Katze", "der Apfel");

function createRegex(&$item) {
    $item = '~'.preg_quote('{'.$item.'}').'~';
}
array_walk($from, 'createRegex');


$input = "Lorem {dog} ipsum dolor{cat} {apple}sit amet consectetuer.";
$output = preg_replace($from, $to[LANGUAGE], $input);
echo $output;
Joker
Profil
ng9:
Jinak stejně moc nerozumím proč holý alias funguje, ale ve spojení se stringem ne
To je jednoduché: Jediné, co se dá v PHP dělat s referencí jako takovou je někam ji přiřadit. Proto reference nemůže být v kontextu, kdy se má něco vyhodnotit.
Krom toho, co by vlastně mělo být výsledkem spojení řetězce s referencí?

Chtěl jsem nějakým elegantním způsobem rozšířit web o další jazykové rozhraní a jako nejjednodušší mi přišlo vytvořit pole s texty na které se budu v určitých místech odkazovat a vypisovat.
Tohle se běžně dělá tak, že se do textu vloží nějaký symbol, tzv. placeholder, který se pak nahradí obsahem proměnné.
Používá se třeba {n}, %n, %n% a podobně, kde n je buď číslo, nebo nějaký identifikátor
Například:
$text = "Odpověď na otázku vesmíru, života a vůbec je {ODPOVED}.";
//kód
echo str_replace("{ODPOVED}", $odpoved, $text);
ng9
Profil
Joker:
Děkuji za vysvětlení aliasu.

A také oběma za uvedené příklady. Podívám se ještě po internetu jaké jsou varianty a jaká jsou jejich úskalí. Každopádně děkuji za zodpovězení otázky.

Mějte se pěkně a díky.

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