Добавление нулевых значений в массив - PullRequest
6 голосов
/ 02 декабря 2010

У меня есть этот метод:

public function search($searchKey=null, $summary=null, $title=null, $authors=null, $paginationPage=0) { 
    ... 
}

И я пытаюсь получить все параметры следующим образом:

$Class = new Search();

// Get parameters
$ReflectionMethod = new \ReflectionMethod($Class, "search");
try {
    foreach($ReflectionMethod->getParameters() AS $Parameter) {
        if(array_key_exists($Parameter->name, $this->params)) {
            $parameters[$Parameter->name] = $this->params[$Parameter->name];
    } elseif($Parameter->isDefaultValueAvailable()) {
        $paramaters[$Parameter->name] = $Parameter->getDefaultValue();
    } else {
            ...
    }
} catch(\Exception $e) {
        ...
}
    // Call function
return call_user_func_array(array($Class, "search"), $parameters);

My $this->params содержит следующее:

array
  'paginationPage' => int 2
  'id' => int 30
  'searchKey' => string 'test' (length=4)

Поскольку $ summary, $ title и $ авторы отсутствуют, они получат значение по умолчанию, равное null. При назначении нулевого значения аргументу он будет пропущен, что приведет к массиву $ parameters, который выглядит следующим образом:

array
  'searchKey' => string 'test' (length=4)
  'paginationPage' => int 2

Что приводит к вызову метода, например:

public function search('test', 2, null, null, 0) { 
        ... 
}

Пока должно быть:

public function search('test', null, null, null, 2) { 
        ... 
}

Надеюсь, вы видите проблему. Как я могу убедиться, что эти нулевые значения также помещены в мой массив $parameters. Добавление недопустимого значения невозможно, потому что это ввод пользователя, поэтому это может быть что угодно.

Редактировать

В приведенном выше примере метод search жестко закодирован. Но одна из упрощенных вещей заключается в том, что search на самом деле является переменной и из-за этого search может быть чем угодно. Это означает, что я не знаю, каковы параметры метода, и я не могу предопределить их до цикла foreach. Решение предопределения параметров - это именно то, что должен делать этот код.

Ответы [ 2 ]

6 голосов
/ 02 декабря 2010

Как насчет предварительной инициализации $parameters перед входом в цикл foreach:

$parameters = array(
    $searchKey => null,
    $summary => null,
    $title => null,
    $authors => null,
    $paginationPage => 0
);
0 голосов
/ 03 декабря 2010

О, боже ... Это была простая опечатка:

...
} elseif($Parameter->isDefaultValueAvailable()) {
    $paramaters[$Parameter->name] = $Parameter->getDefaultValue();
} else {
...

Позор мне!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...