foreach in case ..

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

foreach in case ..

Post by vasilev »

Здравейте,
правя 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
Потребител
Потребител
Reactions: 3
Posts: 627
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

Re: foreach in case ..

Post by Ticketa »

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
Потребител
Потребител
Reactions: 0
Posts: 664
Joined: Sat Feb 07, 2009 12:41 pm
Answers: 25
Location: Everywhere
Contact:

Re: foreach in case ..

Post by vasilev »

това и аз го намерих само че идеята тук е друга.
имаш някакъв параметър и го взимаш с 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
Reactions: 1
Posts: 1612
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 167
Location: Parse error: unexpected "}" in /home/index.php on line 26

Re: foreach in case ..

Post by anonimen »

Хей така можеш да си го направиш - само трябва да сложиш класа и името на функцията като отделни елементи на списък за всеки ключ в $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
Нов
Нов
Reactions: 0
Posts: 1
Joined: Thu Jan 14, 2021 9:33 pm

Re: foreach in case ..

Post by marko_krastec »

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
Потребител
Потребител
Reactions: 0
Posts: 664
Joined: Sat Feb 07, 2009 12:41 pm
Answers: 25
Location: Everywhere
Contact:

Re: foreach in case ..

Post by vasilev »

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

Благодаря .. И двата отговора са ок !
User avatar
vasilev
Потребител
Потребител
Reactions: 0
Posts: 664
Joined: Sat Feb 07, 2009 12:41 pm
Answers: 25
Location: Everywhere
Contact:

Re: foreach in case ..

Post by vasilev »

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

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
Reactions: 1
Posts: 958
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 68

Re: foreach in case ..

Post by Revelation »

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
Reactions: 1
Posts: 1612
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 167
Location: Parse error: unexpected "}" in /home/index.php on line 26

Re: foreach in case ..

Post by anonimen »

vasilev wrote: Fri Jan 15, 2021 10:47 am искам в някакъв момент да добавя нови записи в този array. въпросът е че всички php класове се зареждат автоматично без някаква подретба .
тоест аз няма как да окажа - първо array_push, след това да викна този foo:bar() който ще извика този array.
Тази част и аз не я разбрах, може ли пак :think:
User avatar
djman
Гуру
Гуру
Reactions: 0
Posts: 2833
Joined: Sat Sep 12, 2009 8:07 am
Answers: 111

Re: foreach in case ..

Post by djman »

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