Kvalitní e-mailing již od 0,01 Kč | Vyzkoušejte náš cool e-mailing | coolemailing.cz
Zobrazují se odpovědi 1 až 13 z 13

Funkce s více argumenty předávanými byref

  1. Zdravím.
    Napadlo mě napsat si "makro"/funkci, která mi zkrátí zápis, např.

    PHP kód:
    if (isset($_GET['kategorie']) || isset($_GET['produkt']) || isset($_GET['nastaveni']) || isset($_SESSION['uzivatel']) || isset($_GET['stranka'])) {
       ...

    na
    PHP kód:
    if (anyset($_GET['kategorie'], $_GET['produkty'], $_GET['nastaveni'], $_SESSION['uzivatel'], $_GET['stranka'])) {
        ...

    Pro jeden argument by hlavička této funkce byla
    PHP kód:
    function anyset(&$variable) {
        return isset(
    $variable);

    Já bych ji chtěl rozšířit na libovolný počet parametrů.
    Zkoušel jsem:
    * func_get_args() - hodí Notice: Undefined index
    * func_get_arg() - použít s isset() nejde
    * anyset(...$variables) - hodí Notice: Undefined index
    * anyset(...&$varibles) - není povoleno
    Zná někdo řešení?

    Díky

  2. Co se právě děje na Webtrhu?
  3. Dej to tam jako pole na vstupu.

  4. array_intersect_key($_GET, array_fill_keys(['kategorie'], null))

  5. Citace Původně odeslal musil.david Zobrazit příspěvek
    Dej to tam jako pole na vstupu.
    Sorry - vůbec nerozumím. Co znamená "to" a "tam"?
    Pokud jsi si jistý, že tvá rada funguje, šlo by odpovědět přímo příkladem kódu?

    Citace Původně odeslal node Zobrazit příspěvek
    array_intersect_key($_GET, array_fill_keys(['kategorie'], null))
    Tvůj kód:
    * dělá úplně něco jiného, než potřebuju (nepotřebuju vyplňovat nedefinované proměnné, ale testovat jejich existenci)
    * pro nedefinované proměnné stejně hodí "Notice: undefined index"
    * nefunguje pro můj zadaný příklad, kde používám více polí

    ----
    Nechci být hrubý a cením si, že mi odpovídáte, ale příště prosím jen odpovědi, které mají větší než nulovou informační hodnotu a nemrhají časem. Díky

  6. Casem si mrhas ty sam, protoze vymyslis znovu kolo :) Ale chapu, asi zacinas, tak to chces polopate...

    Mas promennou $_GET, ve ktere muze byt treba deset klicu. Tebe zajimaji pro danou operaci treba jen tri z nich a tak je chces otestovat svou funkci.

    Kód:
    $keys = array('kategorie', 'produkt', 'stranka'); //tyto klice te nyni zajimaji
    
    if (anyset($keys) === TRUE)) {
      //tvuj dalsi kod
    }
    
    function anyset($keys) {
        foreach ($keys as $key) {
            if (isset($_GET[$key]) === FALSE) {
                return FALSE;
            }
        }
    
        return TRUE;
    }
    Samozrejme se da doplnit spousta osetreni, jako treba filter_input(), ale vzhledem k tomu, ze nepouzivas framework a jen nejake vlastni easy custom reseni, tak to asi uplne nepotrebujes.

  7. Jelikož crs nechce pouze $_GET, nebylo by použitelnější něco takového?

    Kód:
    function anyset() {
    	foreach(func_get_args() as $arg) if(isset($arg)) return true;
    	return false;
    }
    Vypadá to, že hledá něco, co mu zobrazí, jestli alespoň 1 z arg existuje, tzn. pokud najdu první existující, vrátím true, jinak pokračuju a pokud nenajdu, vrátím false.. Může být použito jak na ten $_GET, $_SESSION, tak cokoliv..

    Možné použití (bez zobrazování errorů) by bylo např.

    Kód:
    $result = @anyset($_SESSION["username"], $_GET["kategorie"], $_GET["cokoliv"]);

  8. Citace Původně odeslal musil.david Zobrazit příspěvek
    Casem si mrhas ty sam, protoze vymyslis znovu kolo :) Ale chapu, asi zacinas, tak to chces polopate...
    Zdravím, Davide. Jak jsem již psal v příkladu a jak napsal Jiří Mrázek, chci tu funkci testovat i na jiné proměnné než z pole $_GET (a nemusejí to být nutně indexy pole). Je to v mém příkladu v mém prvním příspěvku jasně napsané; netušil jsem, že to někdo tak snadno přehlédne. Proto všechno, co jsi zde zatím napsal, je nepoužitelné a není to k tématu. A proto si troufám tvrdit, že mrháš mým časem.

    Citace Původně odeslal Jiří Mrázek Zobrazit příspěvek
    …nebylo by použitelnější něco takového?
    Taky díky za odpověď, ale jak jsem psal, func_get_args() jsem zkoušel a hází Notice: Undefined index.
    Ohledně @ na potlačení chyby, ok, to jsem nezmínil tak zmiňuju teď – chci řešení bez @.
    ----
    Zná tedy někdo řešení? Existuje vůbec?

  9. Dle mého lepší řešení asi nebude, jelikož nemůžeš předat něco, co neexistuje... A když předáš, tak to bohužel vypíše ten error... Jedině vypnout errory a použít verzi bez @...

  10. Kód:
    test($_GET['kategorie'],$_SESSION['uzivatel'], $_GET['produkty']);
    
    function test(&...$params) {
      foreach($params as $param){
        if(isset($param)){return true;}
      }
      return false;
    }
    Naposledy upravil rkor : 14.07.2018 v 09:43

  11. Tve ego musi byt opravdu nekde u oblak. Vzdy me pobavi tento pristup ;-) A jeste ty reci, jak plytvam tvym casem.

    Ve svem prikladu mas jen glob promenne jako GET a SESSION, tak nerikej, ze jsi napsal neco jasne. Navic je tak jednoduche to predelat. Udelal jsem ti muster, klidne si to rozsir jeste treba o POST a normalni promenne, vzdyt je to jednoduche. Nehazi to zadne errory, funguje to presne jak chces.

    PHP kód:
    $keysGET = array('kategorie''produkt''stranka');
    $keysPOST = array('jmeno''vek');
    $otherVars = array($var1$var2);

    if (
    anyset($keysGET$keysPOST$otherVars) === TRUE)) {
      
    //tvuj dalsi kod
    }

    function 
    anyset($keysGET$keysPOST$otherVars) {
        foreach (
    $keysGET as $key) {
            if (isset(
    $_GET[$key]) === FALSE) {
                return 
    FALSE;
            }
        }

        foreach (
    $keysPOST as $key) {
            if (isset(
    $_POST[$key]) === FALSE) {
                return 
    FALSE;
            }
        }

        foreach (
    $otherVars as $var) {
            if (isset(
    $var) === FALSE) {
                return 
    FALSE;
            }
        }

        return 
    TRUE;

    To by me zajimalo, cim mi umyjes prdel tentokrat a co zase budes kritizovat. Mozna tim, ze tam nemam SESSION? :)) Vahal jsem, zda ti jen tam pridelat, ale ber to jako bojovku a domaci ukol ;-)

    Tohle reseni vyse mas pro pripad &&. Ve svem prikladu mas ||, takze staci predelat logicka vyhodnoceni opacne, napr.

    PHP kód:
        foreach ($keysPOST as $key) {
            if (isset(
    $_POST[$key]) === TRUE) {
                return 
    TRUE;
            }
        } 
    apod.

    Dovedu si predstavit realne pouziti takove funkce s &&. Ale s || opravdu moc ne.
    Naposledy upravil musil.david : 14.07.2018 v 02:53

  12. Citace Původně odeslal rkor Zobrazit příspěvek
    Kód:
    test($_GET['kategorie'],$_SESSION['uzivatel'], $_GET['produkty']);
    
    function test(&...$params) {
      foreach($params as $param){
        if(isset($param){return true;}
      }
      return false;
    }
    Moc pekne :)! Ale neni tohle mozne az od nejake verze phpka?

  13. Citace Původně odeslal musil.david Zobrazit příspěvek
    Moc pekne :)! Ale neni tohle mozne az od nejake verze phpka?
    5.6+

  14. Zdravím všechny! (odpovídám trochu s odstupem, protože tohle vlákno bylo na pár dní omylem zamknuté)

    Citace Původně odeslal rkor Zobrazit příspěvek
    Kód:
    test($_GET['kategorie'],$_SESSION['uzivatel'], $_GET['produkty']);
    
    function test(&...$params) {
      foreach($params as $param){
        if(isset($param)){return true;}
      }
      return false;
    }
    Aha - tak stačilo vyměnit & a ... v mém posledním pokusu-omylu.

    Já mezitím vymyslel řešení, které používá s proměnnou proměnné ($$a), ale to vyžadovalo ručně definovat větší (a omezené) množství parametrů v hlavičce funkce. Sice fungovalo, ale kvůli tomu omezení je tvé řešení lepší.

    Díky moc!

    Citace Původně odeslal Jiří Mrázek Zobrazit příspěvek
    Dle mého lepší řešení asi nebude, jelikož nemůžeš předat něco, co neexistuje... A když předáš, tak to bohužel vypíše ten error... Jedině vypnout errory a použít verzi bez @...
    Jak se ukázalo, tak se řešení našlo.

    Citace Původně odeslal musil.david Zobrazit příspěvek
    Tve ego musi byt opravdu nekde u oblak. Vzdy me pobavi tento pristup ;-) A jeste ty reci, jak plytvam tvym casem.

    Ve svem prikladu mas jen glob promenne jako GET a SESSION, tak nerikej, ze jsi napsal neco jasne. Navic je tak jednoduche to predelat. Udelal jsem ti muster, klidne si to rozsir jeste treba o POST a normalni promenne, vzdyt je to jednoduche. Nehazi to zadne errory, funguje to presne jak chces.

    PHP kód:
     
    To by me zajimalo, cim mi umyjes prdel tentokrat a co zase budes kritizovat. Mozna tim, ze tam nemam SESSION? :)) Vahal jsem, zda ti jen tam pridelat, ale ber to jako bojovku a domaci ukol ;-)

    Tohle reseni vyse mas pro pripad &&. Ve svem prikladu mas ||, takze staci predelat logicka vyhodnoceni opacne, napr.

    PHP kód:
     
    apod.

    Dovedu si predstavit realne pouziti takove funkce s &&. Ale s || opravdu moc ne.
    Milý, Davide,
    Je pěkné, že "tě vždycky baví" můj přístup; mě - abych se přiznal - už moc nebaví třikrát se zeptat a třikrát dostat nepoužitelnou odpověď.
    Mé "řeči, jak plýtvám tvým časem" jsou, bohužel, opodstatněné a to z důvodů, které proberu níže.

    Citace Původně odeslal musil.david Zobrazit příspěvek
    Ve svem prikladu mas jen glob promenne jako GET a SESSION, tak nerikej, ze jsi napsal neco jasne.
    To, že chci funkci s více proměnnými (které nejsou pouze indexy polí a jsou předávané 'byref'), je uvedeno
    1. v mém prvním příspěvku v posledním kódu, kde přesně píšu tvar/hlavičku mé funkce a že ji chci z tohoto tvaru rozšířit na více proměnných (parametrů byref)
    2. v mém prvním příspěvku v seznamu pokusů, které jsem zkoušel, v 3. a 4. odrážce
    3. v mém příspěvku z 13.07.2018 11:14, kde píšu "nepotřebuju vyplňovat nedefinované proměnné, ale testovat jejich existenci" (kde mluvím o obecných proměnných, ne indexech pole)
    4. v příspěvku od Jiřího Mrázka z 13.07.2018 13:37, který říká, že nechci řešit pouze $_GET
    5. v mém příspěvku z 13.07.2018 21:18, kde píšu doslova: "chci tu funkci testovat i na jiné proměnné než z pole $_GET (a nemusejí to být nutně indexy pole)." Když nic jiného, tak tady to píšu explicitně.
    6. v názvu celého tohoto threadu, který mimochodem můžeš vidět v nadpisu a v drobečkové navigaci
    7. v URL stránky, na kterou se právě díváš
    Nikde ode mě není asi slovo o tom, že potřebuju řešit výhradně indexy pole a všude, kde píšu zmiňuju parametry mé funkce, mluvím o parametrech předávaných byref (což jsou obecně jakékoli proměnné).

    Teď ke tvému kódu. Má první námitka je ta, že tvá funkce nemá tvar, o kterém jsem opakovaně, na několika místech a v rozmezí několika dnů psal, jak ho potřebuju.
    Viz výše místa, kde to bylo mnou nebo jinými zmíněno.
    Obecně vzato - když někdo požádá o řešení a napíše formu, jak by to mělo vypadat, tak věz, že je pro něj opravdu nepoužitelné, když si vymyslíš něco jiného a to mu pak tlačíš a zdůrazňuješ, že je to přesně, co potřebuje.

    Citace Původně odeslal musil.david Zobrazit příspěvek
    Udelal jsem ti muster, klidne si to rozsir jeste treba o POST a normalni promenne, vzdyt je to jednoduche.
    Zkusil sis tvůj kód spustit? Já to udělal a zde je pár mých postřehů:
    1. Úplně první, co dostanu, je parsovací fatal error.
      Kód:
      Parse error: syntax error, unexpected ')' in ...\test.php on line 6
      Nevím, jestli to uznáš, ale třeba se mnou budeš chtě nechtě souhlasit, že toto je vyloženě trapné, téměř v jakémkoli kontextu.
    2. ve "foreach ($keysGET as $key)" se nedoporučuje nazývat prvek pole $key, protože název $key se v kontextu foreach používá pro klíč (index).
    3. místo "if (isset($_GET[$key]) === FALSE) {" je doporučeno (z hlediska lepší čitelnosti, kratšímu zápisu, i konvence) "if (!isset($_GET[$key])) {"
    4. Část "return FALSE;" uvnitř funkce je sémanticky chybně.
      Potřebuju vrátit true, pokud existuje alespoň jedna ze všech uvedených proměnných, jinak false (píšu to v prvním kódu mého prvního příspěvku).
      Tvá verze funkce mi vrátí false i v případech, kdy jí předám první proměnné neexistující a za nima existující.
    5. koncové "return TRUE;" je sémanticky chybné (ze stejných důvodů jako uvedeno o bod výše).
    6. Ano, body 4 a 5, jsou pro logickou konjunkci a tvůj kód pod tím (též se zbytečným "=== TRUE") je pro disjunkci. Má námitka se zde vztahuje ke zbytečnosti, neodpovídání na to, co se tazatel ptal (už jsme minimálně jednou probírali); a nekonzistenci mezi obsahem funkce a jejím názvem. Tj. pokud ji implementuješ takhle, nedává smysl ji nazvat anyset(). Opět zde děláš něco jiného, než oč tě žadatel prosí, a výsledkem toho nebude nic jiného než chyby a zmatek.
    7. "{" za hlavičkou funkce by podle konvencí PSR-1 mělo být odřádkované viz (drobnost)
    8. obdobně, TRUE a FALSE neodpovídají konvenci PSR-2 a je doporučeno je psát malými písmeny viz (drobnost)
    9. Když přehlédnu, že funkce je v pro mě nevhodném tvaru, tak tvá věta o "jednoduchém" rozšíření na $_SESSION je fakticky chybná v tom, že v takovém případě je nutno zkontrolovat existenci pole.
    10. Citace Původně odeslal musil.david Zobrazit příspěvek
      Udelal jsem ti muster, klidne si to rozsir jeste treba o POST a normalni promenne, vzdyt je to jednoduche.
      Tato tvá věta je v přímém kontrastu s tvým kódem, protože ten toto rozšíření již má. Toto je chyba na tvé straně, ten typ, co způsobuje pozdější zmatky, zbytečné kolečko otázek atd.
    Ok - něco z výše uvedeného není tak významné; důležité je, zda-li je tvůj kód (po nutném odladění) funkční. Pojďme se na to podívat. Na výstup dostanu toto:
    Kód:
    Notice:  Undefined variable: var1 in ...\test.php on line 4
    Notice:  Undefined variable: var2 in ...\test.php on line 4
    Píšeš, jak je to jednoduché. A tvůj příklad byl zcela ve tvé režii, v tebou kontrolovaném prostředí. Přesto hodí chybovou hlášku.


    Citace Původně odeslal musil.david Zobrazit příspěvek
    Nehazi to zadne errory, funguje to presne jak chces.
    V této tvé větě je tedy chybná jak první, tak druhá část věty. Doufám, že jsem zde vysvětlil v detailu proč.

    A ještě - aby toho nebylo málo - celý tvůj nepotřebný a fakticky chybný příspěvek s nepotřebným a syntakticky chybným kódem jsi napsal poté, co už tu někdo napsal správné řešení.

    Očekával jsem po mé první, nebo alespoň druhé odpovědi na to, že je tvůj příklad špatně a proč konkrétně tomu tak je, alespoň něco jako "sorry - má chyba"; místo toho ses pokusil shodit diskuzi na to, že já jsem ten namyšlenej, který znovu vymýšlí kolo (to jsi mimochodem nevysvětlil) a že jsem asi ten začátečník, kterému to musíš vysvětlil polopaticky (což implikuje, je jsem já ten přihlouplý a ty onen odborník, který se musí snížit na to, aby mě to polopatě podal). Dostaly se mi různé narážky, osobních útoky, gaslighting a pokud ne přímo lži tak spousta nepravdivých tvrzení.

    Zkus si, prosím, na chvíli představit, tuto výměnu názorů bez kontextu tebe, mě a daného předmětu: jeden popíše svůj problém, dodá k němu tvar, ve kterém by výsledek chtěl dostat, a seznam řešení, které vyzkoušel a nezafungovaly mu. Druhý mu v první odpovědi odepíše nekvalitní, nepoužitelnou odpověď na 7 slov, z něhož dvě jsou nic neříkající "to" a "tam", bez příkladu a na základě špatně pochopeného zadání. První ho poprosí o příklad. Druhý odpoví narážkami a chybným příkladem na základě špatně pochopeného zadání. První mu vysvětlí, proč je jeho příklad chybný. Druhý odpoví narážkami až téměř nadávkami, opět chybným příkladem, o kterém - jak zdůrazňuje - je přesně, jak prvý a chce a nehází žádné chyby, přičemž - jak se ukáže - nejen, neplatí ani první ani druhá polovina tohoto tvrzení. Ty jsi, Davide, v tomhle případě ten druhý. Jaký je to pocit?

    A zkus si představit, že se to, co's tu předvedl, dá vztáhnout na tebe. Není až tak těžké si představit, resp. nepřekvapovalo by mě, pokud bys slovně napadal klienty (za jejich zády), muselo by se ti mnohonásobně vysvětlovat, že v něčem děláš chybu a v čem a proč konkrétně, pálil bys hodiny až dny času svého klienta/zaměstnavatele tím, že sis špatně přečetl zadání a na jeho základě si vypracoval špatné řešení a poté zákazníka neoprávněně gaslightoval a přesvědčoval o tom, jak on nemá pravdu a ty ano.

    A co se týče "umývání prdele" (tvůj výraz) - já to nepraktikuju - mám lepší věci na práci. Ale v tomhle případě, myslím, že ses ukázal nejvíc ty v tom pravém světle. Nic jsi nevyřešil, všechny tvé odpovědi byly založeny na chybném pochopení mého jasně napsaného zadání a když jsem tě na to upozornil, svedl jsi to na to, že já jsem ten špatný (nezkušený, namyšlený, začátečník, …) a chybu jsi neuznal. Ať chceš nebo nechceš, něco to vypovídá o tvém charakteru. Tím, že's to takhle vyhrotil, napsal's mi tučným písmem něco, co se ukázalo ze všech úhlů jako nepravda, nezbývá než konstatovat, že ses ztrapnil ty sám - svým vlastním přičiněním. Ale kdo ví - třeba to pro tebe může být moment, ze kterého se poučíš.

    Nic proti tobě, Davide, nemám, ale po této interakci vím jistě, že od tebe určitě nebudu chtít žádnou radu, žádné řešení, žádnou zakázku, ať už bys v tom kterém oboru byl sebelepší. Jeden z těch vícero důvodů je ten, že za celou tu dobu s tvými chybnými a arogantními odpověďmi jsi pouze mrhal mým časem. Myslím, že jsem dostatečně vysvětlil, proč si za tím stojím a proč to tak je.

    Měj se hezky, přeji ti pěkný zbytek prázdnin a třeba více sebereflexe při dalším tvém působení na tomto fóru! ;-)

Hostujeme u Server powered by TELE3