Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Matěj 23. 01. 2018, 00:43:27
-
Ahoj,
když mám takový pole
$arr = ('a'=>'A', 'b'=>'B','c'=>'C'); //Jen nástřel, jedna se o velký pole
a potřebuji zavolat funkci a předat 4 parametry
zavolej_funkci('A','B','C');
zkoušel jsem to takto
$var = implode (',', $arr);
a pak takto
zavolej_funkci($var);
abych ve funkci měl samostatný parametry v proměných
function zavolej_funkci($a,$b,$c){
...
}
ale nejde to, proměnná $a v tý funkci obsahuje všechno a ostatní nic. Nějaký nápad? Jedná se o php.
-
Předej té funkci celé pole, ať si funkce sama vybere, co z toho chce.
-
Řešení původního zadání
<?php
$arr = array('a'=>'A', 'b'=>'B', 'c'=>'C');
zavolej($arr['a'], $arr['b'], $arr['c']);
function zavolej($a, $b, $c) {
...
}
Mé oblíbené řešení v jiném stylu, které je o něco rychlejší a přehlednější:
<?php
$arr = array('a'=>'A', 'b'=>'B', 'c'=>'C');
zavolej($arr);
function zavolej($arr) {
...
}
-
Nechám si poradit, akorát nevím, jestli je to dobře i v tom případě, že to pole má x-set položek, lepší by byla databáze ale není mno.
-
Nechám si poradit, akorát nevím, jestli je to dobře i v tom případě, že to pole má x-set položek, lepší by byla databáze ale není mno.
Stovky položek nepředstavují problém, protože to pole se stejně předává odkazem. Spíš je otázkou, zda funkce zavolej() má z něj brát pokaždé hodnoty se stejnými indexy nebo ne.
Možná by bylo rozumné to přepsat do objektu a z funkce zavolej() udělat metodu bez parametru. Nedávno jsem podobným stylem dělal s atributy IPTC.
-
Indexy jsou odlišné. Mám přepsat pole na objekt? Jak to myslíš? Že mám dát to pole do třídy?
-
existuje call_user_func_array('funkce', $pole), každopádně ti index 'a', který máš v tom poli, nepůjde do argumentu $a ve funkci. Všechny ty indexy se ignorují a bere se jen jejich pořadí, php obecně nebere v potaz názvy argumentů, jen jejich pořadí.
<?php
$arr = array('je'=>'A', 'to'=>'B', 'jedno'=>'C');
call_user_func_array('zavolej', $arr);
function zavolej($a, $b, $c) {
...
}
Uvnitř funkce můžeš zavolat func_get_args(), které ti vrátí pole argumentů, takže argumenty vůbec nemusíš zadávat.
<?php
$arr = array('je'=>'A', 'to'=>'B', 'jedno'=>'C');
call_user_func_array('zavolej', $arr);
function zavolej() {
$argumenty = func_get_args(); // vrátí array(0 => 'A', 1 => 'B', 2 => 'C')
}
Každopádně není důvod si nepředat do funkce celé pole. Dokud to pole nějakým způsobem nezměníš, tak se nevytváří kopie. Pokud to pole uvnitř funkce měníš a chceš tu změnu zachovat i pro tu původní proměnnou, tak můžeš použít referenci.
<?php
$arr = array('a'=>'A', 'b'=>'B', 'c'=>'C');
zavolej($arr);
var_dump($arr); // vrátí array('a'=>'A', 'b'=>'B', 'c'=>'C', 'd' => 'D');
function zavolej(&$arr) {
$arr['d'] = 'D';
}
-
Děkuji za info, a jak to udělat aby to byl objekt? Přeci se s tím líp pracuje jako s polem.
-
Nevím, co je cílem a jakým stylem má aplikace fungovat. Objekty používej, pokud programuješ objektově.
-
Nevím, co je cílem a jakým stylem má aplikace fungovat. Objekty používej, pokud programuješ objektově.
Objekty se běžně používají i při strukturovaném programování.
-
Objekty se běžně používají i při strukturovaném programování.
Tak je používej, pokud programuješ objektově nebo strukturovaně. Jestli mít něco v poli nebo to obalit objektem, to je otázkou kontextu. Rozdíl je totiž pouze ve stylu práce.
-
Stovky položek nepředstavují problém, protože to pole se stejně předává odkazem.
Nepředávají. Odkazem se předávají jen objekty.
-
Stovky položek nepředstavují problém, protože to pole se stejně předává odkazem.
Nepředávají. Odkazem se předávají jen objekty.
Pole se v PHP kopíruje líně, tedy až v okamžiku, kdy ho začneš modifikovat, což se běžně nedělá. Výkon tím tedy nijak netrpí.
-
Hoši že se na to PHPčko nevyserete a nenaučíte se raději C, které je jednodušší a výsledný program tak 1000x rychlejší.
-
Hoši že se na to PHPčko nevyserete a nenaučíte se raději C, které je jednodušší a výsledný program tak 1000x rychlejší.
Ano, PHP napsali programátoři v C. My ctíme jejich práci a proto PHP používáme.
-
Děkuji za info, a jak to udělat aby to byl objekt? Přeci se s tím líp pracuje jako s polem.
SPL
-
Děkuji za info, a jak to udělat aby to byl objekt? Přeci se s tím líp pracuje jako s polem.
Třeba takhle jednoduše:
<?php
$arr = array('a'=>'A', 'b'=>'B', 'c'=>'C');
$obj = (object) $arr;
zavolej($obj);
var_dump($obj);
function zavolej($obj) {
$obj->d = 'D';
}
Ovšem není to OOP, je to jen práce s objektem.
-
Stovky položek nepředstavují problém, protože to pole se stejně předává odkazem.
Nepředávají. Odkazem se předávají jen objekty.
Pole se v PHP kopíruje líně, tedy až v okamžiku, kdy ho začneš modifikovat, což se běžně nedělá. Výkon tím tedy nijak netrpí.
To víme. Ale to jsi neřekl. Ty jsi řekl, že se v php pole předává odkazem. A to není pravda.
-
Ahoj,
když mám takový pole
$arr = ('a'=>'A', 'b'=>'B','c'=>'C'); //Jen nástřel, jedna se o velký pole
a potřebuji zavolat funkci a předat 4 parametry
zavolej_funkci('A','B','C');
Existuje několik řešení tohoto problému.
Pokud máš argumenty v poli, a chceš je jen předat jako argumenty funkci:
call_user_func_array('zavolej_funkci', $arr);
To předpokládá správné pořadí v tom poli.
Nebo můžeš použít funkci extract, kterou ty argumenty z pole $arr rozpustíš do stejně pojmenovaných proměnných. A pak zavoláš přesně to:
zavolej_funkci($a, $b, $c, $d);
Je to funkční, ale vůči lokálnímu kontextu dost drsné. Takže to dělej alespoň v nějaké funkci, ať si něco nepřepíšeš. Na druhou stranu to rovnou můžeš tu funkci volat:
zavolej_funkci($arr['a'], $arr['b'], $arr['c'], $arr['d']);
Bude to čistější, bezpečnější a přehlednější.
Nebo taky můžeš chtít, že to pole je prostě pole, obsahuje hodně parametrů, a tak to do té funkce předej celé jako jeden argument:
zavolej_funkci($arr);
To už ale trochu smrdí, a pouvažoval bych, zda to pole musí být opravdu tak velké. Opravdu ta funkce zpracovává všechny argumenty? (Třeba jo, neříkám nic.)
Vzhledem k tomu, jak to popisuješ bych zvolil:
zavolej_funkci($arr['a'], $arr['b'], $arr['c'], $arr['d']);
Nikdy nepředávej celé pole, pokud je to jen trochu možné.
-
Nebo taky můžeš chtít, že to pole je prostě pole, obsahuje hodně parametrů, a tak to do té funkce předej celé jako jeden argument:
zavolej_funkci($arr);
To už ale trochu smrdí, a pouvažoval bych, zda to pole musí být opravdu tak velké. Opravdu ta funkce zpracovává všechny argumenty? (Třeba jo, neříkám nic.)
Nikdy nepředávej celé pole, pokud je to jen trochu možné.
Nevidím k tomuto doporučení žádný důvod. I velké pole v PHP předávám jako jeden argument. Je to tak mnohem přehlednější a ani výkon tím netrpí - spíše naopak. Běžně tak předávám např. celé $_GET nebo $_POST právě proto, že skript v tu chvíli netuší, které položky jsou vyplněny a které nejsou.
-
Nevidím k tomuto doporučení žádný důvod.
https://en.wikipedia.org/wiki/Dependency_injection (https://en.wikipedia.org/wiki/Dependency_injection)
Vkládat celé pole je varianta https://en.wikipedia.org/wiki/Service_locator_pattern (https://en.wikipedia.org/wiki/Service_locator_pattern) obecně považované za antipattern. To, že to není objekt, ale pole je jen nepodstatný detail. Princip a tím i problém je stejný.
-
Vkládat celé pole je varianta https://en.wikipedia.org/wiki/Service_locator_pattern (https://en.wikipedia.org/wiki/Service_locator_pattern) obecně považované za antipattern. To, že to není objekt, ale pole je jen nepodstatný detail. Princip a tím i problém je stejný.
Nepleť si předávání pole (zde to ani není pole, ale slovník) se vzorem Service Locator a raději si přečti Clean Code, kde je tento postup doporučován místo většího než malého počtu parametrů.
-
Vkládat celé pole je varianta https://en.wikipedia.org/wiki/Service_locator_pattern (https://en.wikipedia.org/wiki/Service_locator_pattern) obecně považované za antipattern. To, že to není objekt, ale pole je jen nepodstatný detail. Princip a tím i problém je stejný.
Nepleť si předávání pole (zde to ani není pole, ale slovník) se vzorem Service Locator a raději si přečti Clean Code, kde je tento postup doporučován místo většího než malého počtu parametrů.
Princip a tím i problém je stejný.
Ale dosti bylo krmení trolla.