Как передать несколько параметров функции в массиве в php? - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу передать несколько параметров функции в массиве. Сами параметры являются массивами строк.

У меня есть функция с именем new_action(), которую я вызываю следующим образом:

new_action(array('actions' => array('ACTION1','ACTION2'), 'tables' => array('table1','table2')));

, и эта функция выглядит следующим образом:

public function new_action($params=array()) {
  $tables = array();
  $actions = array();

  if(count($params)) {
    foreach($params as $k => $v) {
      $tables  = ($k == 'tables')  ? $v : array();
      $actions = ($k == 'actions') ? $v : array();
    }

    // Do useful stuff with the variables here ...
    var_dump($tables);
    var_dump($actions);

    // ======== ACTUAL OUTPUT: ========
    // array(0) { }
    // array(0) { }

    // ======== EXPECTED OUTPUT: ========
    // array(2) { [0]=> string(6) "table1" [1]=> string(6) "table2" }
    // array(2) { [0]=> string(7) "ACTION1" [1]=> string(7) "ACTION2" }
  } 
}

Как видите, значение $v внутри l oop (массива строк) никогда не копируется в переменную $tables или $actions вне l oop.

Я думаю, что это, скорее всего, проблема масштаба, но поиск ответов на другие вопросы, подобные этому, не прояснил решение для меня.

Как выполнить рефакторинг кода, чтобы я мог получить доступ к тем массивам, хранящимся в $v, для каждого $k за пределами foreach l oop?

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

Ваш код перезаписывает то, что было ранее установлено, потому что вы устанавливаете значения на array(), когда ключ не соответствует tables или actions. Поэтому, когда $k == 'tables', $actions возвращается к пустому массиву.

Вместо троичного оператора, в основном, if/else, рефакторинг просто к if, если вы хотите сохранить l oop:

foreach($params as $k => $v) {
        if ($k == 'tables') {
            $tables = $v;
        }
        if ($k == 'actions') {
            $actions = $v;
        }

    }

Или его можно немного сжать, проверяя четкость этих ключей в начале вместо цикла:

function new_action($params=array()) {

    $tables = isset($params['tables']) ? $params['tables'] : array();

    $actions = isset($params['actions']) ? $params['actions'] : array();

    // Do useful stuff with the variables here ...
    var_dump($tables);
    var_dump($actions);

}
1 голос
/ 14 апреля 2020

Значения пустые, потому что с помощью foreach вы перезаписываете существующие значения.

Вы можете даже написать его проще и использовать сокращенный синтаксис массива с скобками для лучшей читаемости.

Оператор null coalesce является синтаксическим c сахар, чтобы избежать записи isset(), а также является троичным. Если он установлен, он вернет свое содержимое, в противном случае будет установлен пустой массив.

new_action(['actions' => ['ACTION1', 'ACTION2'], 'tables' => ['table1', 'table2']]);

function new_action($p = array()): void {
    $tables  = $p['tables']  ?? [];
    $actions = $p['actions'] ?? [];

    var_dump($tables);
    var_dump($actions);
}

array (2) {[0] => string (6) "table1" [1] => string (6) "table2"}
array (2) {[0] => string (7) "ACTION1" [1] => string (7) "ACTION2"}

1 голос
/ 14 апреля 2020

На самом деле вам не нужен foreach для получения этого вывода:

public function new_action($params = array()) {
  $tables = array_key_exists('tables', $params) ? $params['tables'] : [];
  $actions = array_key_exists('actions', $params) ? $params['actions'] : [];

  // Do useful stuff with the variables here ...
  var_dump($tables); // Outputs => array(2) { [0]=> string(6) "table1" [1]=> string(6) "table2" }
  var_dump($actions); // Outputs => array(2) { [0]=> string(7) "ACTION1" [1]=> string(7) "ACTION2" }
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...