Drilled-prog
@Drilled-prog
Программирую на ['php', 'js']

Как сгенерировать список по многим условиям?

Нужна функция, которая принимает параметры:

function generator($pattern, $conditions) {
    ...
}

Используется она так:

generator('http://site.com/{lang}/{category}/page/{page}', [
    'category' => 'other',
    'lang' => ['en', 'ru'],
    'page' => [1, 2],
]);

На выходе должно получится:

http://site.com/en/other/page/1
http://site.com/en/other/page/2
http://site.com/ru/other/page/1
http://site.com/ru/other/page/2
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
0xD34F
@0xD34F
function generator($str, $params) {
  $result = [];

  if (count($params)) {
    $key = key($params);
    $values = is_array($params[$key]) ? $params[$key] : [ $params[$key] ];
    unset($params[$key]);

    foreach ($values as $val) {
      array_push($result, ...generator(str_replace("{{$key}}", $val, $str), $params));
    }
  } else {
    $result[] = $str;
  }

  return $result;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Carburn
Решение без рекурсии
function generator($str, $params) {
    $result = [$str];

    foreach ($params as $key => $param) {
        $values = is_array($params[$key]) ? $params[$key] : [$params[$key]];
        $copy = unserialize(serialize($result));
        
        foreach ($values as $val) {
            foreach ($result as &$oneResult) {
                $oneResult = str_replace(sprintf("{%s}", $key), $val, $oneResult);
            }
            if ($val != end($values)) {
                $result = array_merge($copy, $result);
            }
        }
    }

    return $result;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы