Заполнение массива рекурсивной функцией класса

#php #arrays #function #class #recursion

#php #массивы #функция #класс #рекурсия

Вопрос:

Я застрял, возможно, с простым вопросом. Я создал новый класс со многими вычислениями внутри. У меня есть рекурсивный массив для динамической генерации SQL из результата Die. Когда результат находится между заданным диапазоном, мне придется выполнить дополнительную операцию.

У меня есть этот многомерный массив для заполнения значением моей кости, используя массив идентификаторов в качестве моего первого «ключа»:

 $this->multidim[$id_object][]
  

Я думал о создании другой функции для ее заполнения, но я не уверен, как ее правильно построить. Спецификации этой функции, которые мне нужны, следующие:

  • Мне нужно вызвать функцию с многомерным массивом и
  • Если результат равен 100, мне нужно дважды бросить кости и снова проверить результат
 $this->checkresult($id_obj, $die);

function checkresult($id_obj, $die)
{
    if ($die == 100){

        $rand1 = $this->launchDie(1, 100);
        $rand2 = $this->launchDie(1, 100);

        if($this->checkresult($array, $rand1)) {
            if($this->checkresult($array, $rand2)) {
                return 1;
            }
        }
    } else {
        if (!isset($array[$tiro])) {
            $this->multidim[$id_obj][$die] = 1;
        }

        return 1;
    }
}
  

Правильный ли этот подход? Мне неудобно не возвращать «реальное» значение, но, как я уже сказал, мне нужно повторно вызвать эту функцию рекурсивно.

Комментарии:

1. Для чего нужен код setSpecialCount() и откуда берутся переменные $array и $tiro ?

2. извините, я забыл изменить свою ссылку. редактирование прямо сейчас.

Ответ №1:

Вы можете вернуть свернутое значение следующим образом:

 public function addResult($object_id, $result)
{
        $this->multidim[$object_id][] = $result;
}

public function checkResult($object_id)
{
        $roll = $this->launchDie(1, 100);

        if ($roll == 100) {
                $additionalRoll = $this->checkResult($object_id);
                $this->addResult($object_id, $additionalRoll);

                $roll = $this->checkResult();
        }

        return $roll;
}
  

И назовите это так:

 $this->addResult($object_id, $this->checkResult($object_id));
  

Таким образом, каждый раз, когда выпадает 100, будет два броска вместо одного. Пожалуйста, обратите внимание, что это может продолжаться вечно (хотя это маловероятно ;)).

Также обратите внимание, что я изменил структуру вашего многомерного массива, так как это имело для меня больше смысла, вам может потребоваться изменить это обратно, если оно не соответствует тому, чего вы хотели бы достичь.