【问题标题】:How can I call functions in PHP depending of their position?如何根据位置调用 PHP 中的函数?
【发布时间】:2019-06-01 10:32:44
【问题描述】:

我目前正在尝试为 PHP 中的某些 div 构建排序功能。首先,我将每个部分放入一个函数中,这样当我调用这个函数时,该部分就会被打印出来。

现在我的问题是我不知道如何根据他们的位置调用每个部分?这是我的代码:

    $elements = array(
        'section_one'   => 6,
        'section_two'   => 1,
        'section_three' => 0,
        'section_four'  => 3,
        'section_five'  => 2,
        'section_six'   => 5,
        'section_seven' => 4
    );

    foreach ( $elements as $element => $position ) {

    }

    get_section_one( $a, $b, $c );
    get_section_two( $a, $b, $c, $d );
    get_section_three( $a, $b );
    get_section_four( $a );
    get_section_five( $a, $b, $c, $d, $e );
    get_section_six( $a, $b, $c );
    get_section_seven( $a, $b, $c );

每个函数都有不同的未定义参数。 $elements 数组有一个键,它是部分的名称和一个定义位置的值。

那么有谁知道我如何根据它们从最低数字到最高数字的位置来调用每个函数?

在我的示例中,section_three 必须是第一个应该被调用的元素...

【问题讨论】:

    标签: php arrays function loops


    【解决方案1】:

    对于订单,您需要sort your array(现在asort() 是您所需要的),但在此之前,我会重新设计数组并使函数位置成为键,而不是您现在拥有的值(假设位置当然是独一无二的)。排序后,您可以使用通常的 foreach($elements as $func_name) 进行迭代,而您正在寻找的辅助方法是 call_user_func()

    foreach ( $elements as $func_name ) {
        call_user_func($func_name, ....)
    }
    

    但是有一个问题,每个函数都有不同数量的参数,所以这可能会变得很棘手。您可能希望重新编写函数以接受即参数数组。这可能还有好处,因为参数数组可能是您的 $elements 数组的十部分,因此不需要额外的“构建器”逻辑,即:

    
    $elements = [
      0 => [ 'name' => 'section_three',
             'args' => [$a, $b],
           ],
      ...
      2 => [ 'name' => 'get_section_five',
             'args' => [$a, $b, $c, $d, $e],
           ],
      ...
    ];
    
    ksort($elements);
    
    foreach($elements as $el) {
        call_user_func($el['name'], $el['args']);
    }
    
    

    【讨论】:

    • 位置是我网站上每个元素的顺序,所以 0 是第一个,1 是下一个,依此类推。是的,我有多个参数,每个函数都不同。那么知道如何解决这个问题并以正确的顺序获取每个功能吗?
    • 现在我明白了。就我而言,我无法将 args 保存在数组中,因为它来自我的数据库。我的想法是将所有内容放在一个开关中,并根据函数将参数传递给调用。这是个好主意吗?
    【解决方案2】:

    您可以在循环之前使用asort() 对元素进行排序(保留数组的键)。

    $elements = array(
        'section_one'   => 6,
        'section_two'   => 1,
        'section_three' => 0,
        'section_four'  => 3,
        'section_five'  => 2,
        'section_six'   => 5,
        'section_seven' => 4
    );
    
    asort($elements);
    
    foreach ( $elements as $element => $position ) {
    
    }
    

    【讨论】:

    • 如果您只有几个功能,这是一种方法。如果你有 1000 个函数名怎么办?在 foreach 中你会做一个巨大的 switch 或 if/else 语句?我认为 Marcin Orlowski 的回答比这个要好很多
    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多