Как я могу вызывать функции в PHP в зависимости от их положения? - PullRequest
0 голосов
/ 01 июня 2019

В настоящее время я пытаюсь создать функцию сортировки для некоторых div в PHP. Сначала я поместил каждый раздел в одну функцию, чтобы при вызове этой функции был напечатан раздел get.

Теперь у меня проблема в том, что я не знаю, как я могу назвать каждый раздел в зависимости от их положения? Это мой код:

    $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 должен быть первым элементом, который должен называться ...

Ответы [ 2 ]

3 голосов
/ 01 июня 2019

Для заказа вам нужно отсортировать массив (сейчас asort() - это то, что вам нужно), но перед этим я бы переделал массив и сделал положение функции ключом, а не значение как у вас сейчас (при условии, что позиция уникальна, конечно). После сортировки вы можете выполнять итерацию, используя обычный foreach($elements as $func_name), а вспомогательный метод, который вы ищете, это call_user_func () :

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

Есть одна проблема, однако, у вас есть различное количество аргументов для каждой из этих функций, так что это может быть сложно. Возможно, вы захотите переработать ваши функции, чтобы вместо них принимать массив аргументов. Это может быть дополнительно выгодно, так как массив arguments может составлять десять частей вашего $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 голосов
/ 01 июня 2019

Вы можете использовать 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 ) {

}
...