foreach in case ..

C++ JAVA
User avatar
vasilev
Потребител
Потребител
Posts: 663
Joined: Sat Feb 07, 2009 12:41 pm
Answers: 25
Location: Everywhere
Contact:

foreach in case ..

Post by vasilev » Thu Jan 14, 2021 8:20 pm

Здравейте,
правя rest api по логика:

Code: Select all

switch ($_GET["p"]){
  case add: class::function().
...
опитвам се да вкарам динамично тези функции в array:

Code: Select all

$arr=array(
    "add"=>Class1::add(),
    "read"=>Class2::read(),
);
switch ($_GET["p"]){
    foreach($arr as $k=>$v){
      case $k: ${v}; break;
    }
    default: echo "ok";
}
имате ли идеи как това да проработи :)

User avatar
Ticketa
Турист
Турист
Posts: 598
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

Re: foreach in case ..

Post by Ticketa » Thu Jan 14, 2021 8:44 pm

Code: Select all

<?php
$x=array(
    0 => 'foo',
    1 => 'bar',
    2 => 'foobar'
);
$y = 'foo';
foreach ($x as $i) {
    switch($i){
        case $y:
            print 'Variable $x tripped switch: '.$i.'<br>';
            break;
    }
}

?>

User avatar
vasilev
Потребител
Потребител
Posts: 663
Joined: Sat Feb 07, 2009 12:41 pm
Answers: 25
Location: Everywhere
Contact:

Re: foreach in case ..

Post by vasilev » Thu Jan 14, 2021 9:20 pm

това и аз го намерих само че идеята тук е друга.
имаш някакъв параметър и го взимаш с GET. правиш case този параметър - да вика друга static function.

искам да постигна нещо от сорта:

Code: Select all

class foo{
    public static function bar(){
        echo "ok";
    }
}
class foo2{
    public static function bar2(){
        echo "ok2";
    }
}
class foo3{
    public static function bar3(){
        echo "ok3";
    }
}
$x=array(
    "foo" => foo::bar(),
    "foo2" => foo2::bar2(),
    "foo3" => foo3::bar3(),
);
$y = $_GET["page"];
foreach ($x as $k=>$i) {
    switch($k){
        case $y:
            $i;
            break;
    }
}

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1607
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 165
Location: Parse error: unexpected "}" in /home/index.php on line 26

Re: foreach in case ..

Post by anonimen » Thu Jan 14, 2021 9:34 pm

Хей така можеш да си го направиш - само трябва да сложиш класа и името на функцията като отделни елементи на списък за всеки ключ в $arr:

Code: Select all

<?php
class Class1 { static function addMethod() { echo "Class1::add() called!\n"; } }
class Class2 { static function readMethod() { echo "Class2::read() called\n"; } }

$arr=array(
    "add" => [Class1::class, "addMethod"],
    "read"=> [Class2::class, "readMethod"],
);

$keys = ["add", "non-existing", "read"];

$key = $_GET['p'];

if(array_key_exists($key, $arr)) {
	call_user_func($arr[$key]);
} else {
	echo "default, nothing called";
}

Ето демо с няколко ключа, за да видиш как работи: https://www.ideone.com/8FGlSY

ПП. Оправих го да не хвърля предупреждения поради употребата на Class1 и Class2 "на голо".

User avatar
marko_krastec
Нов
Нов
Posts: 1
Joined: Thu Jan 14, 2021 9:33 pm

Re: foreach in case ..

Post by marko_krastec » Thu Jan 14, 2021 9:49 pm

Code: Select all

<?php

class foo
{
    public static function bar()
    {
        echo "ok";
    }
}

class foo2
{
    public static function bar2()
    {
        echo "ok2";
    }
}

class foo3
{
    public static function bar3()
    {
        echo "ok3";
    }
}

$x = array(
    "foo" => function () {foo::bar();},
    "foo2" => function () {foo2::bar2();},
    "foo3" => function () {foo3::bar3();}
);

$page = $_GET["page"];

if (isset($_GET['page'])) {
    $page = $_GET['page'];
    if(isset($x[$page])){
        $x[$page]();
        exit;
    }
}
die('404 page not found');


User avatar
vasilev
Потребител
Потребител
Posts: 663
Joined: Sat Feb 07, 2009 12:41 pm
Answers: 25
Location: Everywhere
Contact:

Re: foreach in case ..

Post by vasilev » Thu Jan 14, 2021 9:56 pm

Да.. И аз така тъкмо направих с key exist :)

Благодаря .. И двата отговора са ок !

User avatar
vasilev
Потребител
Потребител
Posts: 663
Joined: Sat Feb 07, 2009 12:41 pm
Answers: 25
Location: Everywhere
Contact:

Re: foreach in case ..

Post by vasilev » Fri Jan 15, 2021 10:47 am

стигнах до извода че това което искам да направя май не е толкова лесно :)
обеснявам:

Code: Select all

$tst=array(
    "test"=>function () {foo1::bar1();},
    "test2"=>function () {foo2::bar2();},
);
class Foo{
    public static function bar(){
        global $tst;
        print_r($tst);
    }
}
Foo::bar();
array_push($tst,array("test3"=>function () {foo3::bar3();}));
имаме array с описание на други функции .
искам в някакъв момент да добавя нови записи в този array. въпросът е че всички php класове се зареждат автоматично без някаква подретба .
тоест аз няма как да окажа - първо array_push, след това да викна този foo:bar() който ще извика този array.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 922
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 65

Re: foreach in case ..

Post by Revelation » Sun Jan 17, 2021 12:45 am

vasilev wrote:
Fri Jan 15, 2021 10:47 am
стигнах до извода че това което искам да направя май не е толкова лесно :)
обеснявам:

Code: Select all

$tst=array(
    "test"=>function () {foo1::bar1();},
    "test2"=>function () {foo2::bar2();},
);
class Foo{
    public static function bar(){
        global $tst;
        print_r($tst);
    }
}
Foo::bar();
array_push($tst,array("test3"=>function () {foo3::bar3();}));
имаме array с описание на други функции .
искам в някакъв момент да добавя нови записи в този array. въпросът е че всички php класове се зареждат автоматично без някаква подретба .
тоест аз няма как да окажа - първо array_push, след това да викна този foo:bar() който ще извика този array.
По-лесно е да кажеш идеята си вместо да ни кажеш какъв метод се опитваш да имплементираш. След този global дето използва в класа се съмнявам да си в права посока.

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1607
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 165
Location: Parse error: unexpected "}" in /home/index.php on line 26

Re: foreach in case ..

Post by anonimen » Sun Jan 17, 2021 8:52 am

vasilev wrote:
Fri Jan 15, 2021 10:47 am
искам в някакъв момент да добавя нови записи в този array. въпросът е че всички php класове се зареждат автоматично без някаква подретба .
тоест аз няма как да окажа - първо array_push, след това да викна този foo:bar() който ще извика този array.
Тази част и аз не я разбрах, може ли пак :think:

User avatar
djman
Гуру
Гуру
Posts: 2817
Joined: Sat Sep 12, 2009 8:07 am
Answers: 109

Re: foreach in case ..

Post by djman » Sun Jan 17, 2021 10:36 am

Виж и spl_autoload_register. Пример за динамично създаване на класове - тук.

Post Reply