Задать вопрос
abler98
@abler98
Software Engineer

PHP. В чём магия?

Добрый день,

Я вот столкнулся сегодня с небольшой проблемой. Мне удалось её решить, но я одного я не понял:

Короче вот рабочий кусочек кода
foreach ($this->allowableTags as $tag) {
			foreach ($doc->getElementsByTagName($tag) as $element) {
				$attributes = $element->attributes;
				$attrs = [];
				for ($i = 0; $i < $attributes->length; ++$i) {
					$attrs[] = $attributes->item($i);
				}
				foreach ($attrs as $attr) {
					$this->clearElement($element, $attr);
				}
			}
		}


А вот нерабочий
foreach ($this->allowableTags as $tag) {
			foreach ($doc->getElementsByTagName($tag) as $element) {
				$attributes = $element->attributes;
				for ($i = 0; $i < $attributes->length; ++$i) {
					$attr = $attributes->item($i);
					$this->clearElement($element, $attr);
				}
			}
		}


По сути ведь разницы нет, но в первом примере все атрибуты удаляются, а во втором нет. Почему так? И какие есть ещё решения?
  • Вопрос задан
  • 294 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Потому что при удалении атрибута происходит перенумерация остальных. Пусть есть три атрибута, их номера будут 0, 1 и 2.
Шаг 1. 
  $i = 0. 
  Удаляем атрибут 0.
  Атрибуты 1 и 2 получают номера 0 и 1.
Шаг 2.
  $i = 1.
  Удаляем атрибут 1.
  Остался атрибут 0.

Ну а PHP здесь совсем не виноват.
foreach ($this->allowableTags as $tag) {
  foreach ($doc->getElementsByTagName($tag) as $element) {
    $attributes = $element->attributes;
    while ($attributes->length > 0) {
      $attr = $attributes->item(0);
      $this->clearElement($element, $attr);
    }
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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