Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Matěj 23. 01. 2018, 00:43:27

Název: Jak funkci předat parametry uložené v poli?
Přispěvatel: Matěj 23. 01. 2018, 00:43:27
Ahoj,
když mám takový pole
Kód: [Vybrat]
$arr = ('a'=>'A', 'b'=>'B','c'=>'C'); //Jen nástřel, jedna se o velký polea potřebuji zavolat funkci a předat 4 parametry
Kód: [Vybrat]
zavolej_funkci('A','B','C');zkoušel jsem to takto
Kód: [Vybrat]
$var = implode (',', $arr);a pak takto
Kód: [Vybrat]
zavolej_funkci($var);abych ve funkci měl samostatný parametry v proměných
Kód: [Vybrat]
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 23. 01. 2018, 00:55:32
Předej té funkci celé pole, ať si funkce sama vybere, co z toho chce.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 23. 01. 2018, 01:08:38
Řešení původního zadání
Kód: [Vybrat]
<?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ší:
Kód: [Vybrat]
<?php
$arr 
= array('a'=>'A''b'=>'B''c'=>'C');
zavolej($arr);

function 
zavolej($arr) {
...
}
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Matěj 23. 01. 2018, 01:30:58
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 23. 01. 2018, 05:04:24
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Matěj 23. 01. 2018, 11:41:20
Indexy jsou odlišné. Mám přepsat pole na objekt? Jak to myslíš? Že mám dát to pole do třídy?
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: crabik 23. 01. 2018, 12:39:13
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í.

Kód: [Vybrat]
<?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.

Kód: [Vybrat]
<?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.

Kód: [Vybrat]
<?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';
}
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Matěj 23. 01. 2018, 12:49:52
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: crabik 23. 01. 2018, 13:06:58
Nevím, co je cílem a jakým stylem má aplikace fungovat. Objekty používej, pokud programuješ objektově.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 23. 01. 2018, 13:26:20
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í.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: crabik 23. 01. 2018, 13:47:28
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: BoneFlute 23. 01. 2018, 16:09:03
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 23. 01. 2018, 16:44:11
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í.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Pennis Fitchie 23. 01. 2018, 22:56:51
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ší.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 23. 01. 2018, 23:24:06
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Ivan Nový 24. 01. 2018, 01:17:38
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
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 24. 01. 2018, 08:50:54
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:
Kód: [Vybrat]
<?php
$arr 
= array('a'=>'A''b'=>'B''c'=>'C');
$obj = (object) $arr;
zavolej($obj);
var_dump($obj);

function 
zavolej($obj) {
    
$obj->'D';
}

Ovšem není to OOP, je to jen práce s objektem.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: BoneFlute 24. 01. 2018, 14:47:01
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: BoneFlute 24. 01. 2018, 16:15:39
Ahoj,
když mám takový pole
Kód: [Vybrat]
$arr = ('a'=>'A', 'b'=>'B','c'=>'C'); //Jen nástřel, jedna se o velký polea potřebuji zavolat funkci a předat 4 parametry
Kód: [Vybrat]
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
zavolej_funkci($arr['a'], $arr['b'], $arr['c'], $arr['d']);
Nikdy nepředávej celé pole, pokud je to jen trochu možné.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 24. 01. 2018, 16:44:38
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:
Kód: [Vybrat]
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.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: BoneFlute 24. 01. 2018, 21:10:16
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ý.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: Kit 24. 01. 2018, 21:36:52
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ů.
Název: Re:Jak funkci předat parametry uložené v poli?
Přispěvatel: BoneFlute 24. 01. 2018, 21:45:19
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.