Можно ли избежать повторения вызова метода в php, когда объект, добавленный в список, одинаков? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть метод в классе, который получает элемент и помещает его в список, у класса есть другой метод, который печатает этот список как дерево, но проблема в том, что когда вы добавляете тот же объект, что и дочерний, он преобразуется вбесконечный цикл.Как можно избежать этого?Как я могу проверить, является ли объект, который будет добавлен в дерево, той же ссылкой?

class Tree {
   public $nodeName;
   public $elements;
   public function addElement( $element )
   {
      if (!is_array( $this->elements )) $this->elements = array();
      array_push( $this->elements, $element );
   }
   public function print()
   {
      echo $this->nodeName;
      foreach ($this->elements as $element) {
          $element->print();
      }
   }
}

$t = new Tree();
$t->addElement( $t );
$t->print();

Спасибо.

1 Ответ

0 голосов
/ 16 октября 2018

Если все, что вам нужно, это проверить, добавлен ли тот же объект, вы можете использовать: if ($element === $this).

Формальная документация здесь: http://php.net/manual/en/language.oop5.object-comparison.php

Но вы также должны рассмотреть случай, который в цикле вызывается несколькими уровнями (например, root добавлен в leaf, например).Этого следует избегать из-за того, что определение дерева является графом без кружков ...

Чтобы убедиться, что я добавлю имя функции exist($elementToFind) в класс дерева со следующим алгоритмом:

  1. Если $elementToFind === $this вернуть true.
  2. foreach $this->elements: если $element->exist($elememtToFind) вернуть true.

Теперь все, что вам нужно, это вызвать *Метод 1021 * в начале функции addElement и, если она возвращает true, выдает ошибку.

Обратите внимание, что это не решит проблему добавления дерева b с листом a к дереву a - так что вы можетеотметьте также все elements под новым элементом, который вы хотите добавить.Вы можете сделать это, добавив 3 шага:

Foreach $elementToFind->$elememts as $elem: если $elem->exist($this) верно -> вернуть true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...