Ninazu
@Ninazu

Как удалить элемент по ссылке на него?

Задача заключается в обходе всего дерева. Для этих целей использую рекурсию. Теперь нужно по условию удалить элемент из дерева, если его значение удовлетворяет условие
class Test {

	public function __construct() {
		$this->test1 = [
			'a' => 1,
			'b' => [
				'd' => [
					'e' => 'test'
				],
			],
			'c' => null,
			'd' => (object)[
				'e' => 'test',
			],
			'f' => (object)[
				'test' => 'a',
				'e' => (object)[
					'test' => 'test',
				],
			]
		];

		$this->test2 = [
			'e' => 'test',
		];

		$this->test3 = 'test';

		$this->test4 = [
			'test',
		];

		$this->test5 = (object)[
			'test',
		];

		$this->checkTypeRecursive($this->test1);
		$this->checkTypeRecursive($this->test2);
		$this->checkTypeRecursive($this->test3);
	}

	public function checkTypeRecursive(&$values) {
		if (is_array($values)) {
			foreach ($values as $key => $value) {
				$this->checkTypeRecursive($values[$key]);
			}
		} elseif (is_object($values)) {
			foreach ($values as $key => $value) {
				$this->checkTypeRecursive($values->$key);
			}
		} else {
			if ($values == 'test') {
				//Присвоение по ссылке работает.
				$values = 'Привет';

				/** А как удалить элемент на который эта ссылка получена */
				//unset($values); //Так не сработает ибо это значение.

				/**
				 * Остальная логика
				 * ....
				 */
			}
		}
	}
}

print_r(new Test());


Возможно зашел не с той стороны. Как тогда максимально просто это сделать. Спасибо.
  • Вопрос задан
  • 172 просмотра
Решения вопроса 1
@OVK2015
public function checkTypeRecursive(&$values)
  {
    if(is_array($values))
    {
      foreach($values as $key => $value)
      {
        if($this->checkTypeRecursive($values[$key])){unset($values[$key]);}
      }
      return false;
    }
    elseif(is_object($values))
    {
      foreach($values as $key => $value)
      {
        if($this->checkTypeRecursive($values->$key)){unset($values->$key);}
      }
      return false;
    }
    else
    {
      if ($values == 'test')
      {
        return true;
      }
    }
  }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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