Я использую PHP (с KirbyCMS) и могу создать этот код:
$results = $site->filterBy('a_key', 'a_value')->filterBy('a_key2', 'a_value2');
Это цепь с двумя filterBy
, Оно работает.
Однако мне нужно построить вызов функции, как это динамически. Иногда это могут быть два вызова функции, иногда три или более.
Как это сделать?
Может быть, вы можете играть с этим кодом?
Цепочка — это просто случайное число, которое можно использовать для создания от 1 до 5 цепочек.
for( $i = 0; $i < 10; $i ++ ) {
$chains = rand(1, 5);
}
Примеры желаемого результата
Пример первый, только один вызов функции
$results = $site->filterBy('a_key', 'a_value');
Пример два, много вызовов вложенных функций
$results = $site->filterBy('a_key', 'a_value')->filterBy('a_key2', 'a_value2')->filterBy('a_key3', 'a_value3')->filterBy('a_key4', 'a_value4')->filterBy('a_key5', 'a_value5')->filterBy('a_key6', 'a_value6');
$chains = rand(1, 5)
$results = $site
$suffix = ''
for ( $i = 1; $i <= $chains; $i ++) {
if ($i != 1) {
$suffix = $i
}
$results = $results->filterBy('a_key' . $suffix, 'a_value' . $suffix)
}
Если вы можете пройти 'a_key1'
а также 'a_value1'
на первый звонок filterBy
вместо 'a_key'
а также 'a_value'
Вы можете упростить код, удалив $suffix
и if
блокировать и просто добавлять $i
,
Вам не нужно генерировать список связанных вызовов. Вы можете поместить аргументы каждого вызова в список, а затем написать новый метод класса, который получает их из списка и использует их для вызова filterBy()
несколько раз.
Я предполагаю из вашего примера кода, что функция filterBy()
возвращается $this
или другой объект того же класса, что и site
,
//
// The code that generates the filtering parameters:
// Store the arguments of the filtering here
$params = array();
// Put as many sets of arguments you need
// use whatever method suits you best to produce them
$params[] = array('key1', 'value1');
$params[] = array('key2', 'value2');
$params[] = array('key3', 'value3');
//
// Do the multiple filtering
$site = new Site();
$result = $site->filterByMultiple($params);
//
// The code that does the actual filtering
class Site {
public function filterByMultiple(array $params) {
$result = $this;
foreach ($params as list($key, $value)) {
$result = $result->filterBy($key, $value);
}
return $result;
}
}
Если filterBy()
возвращается $this
тогда вам не нужна рабочая переменная $result
; вызов $this->filterBy()
а также return $this;
и удалить другие вхождения $result
,