Jonathan корректен. PHP выстраивает действие как отображение таблицы карты ключи к значениям. в некоторых случаях можно получить индекс, если массив будет определен, такой как
$var = array(2,5);
for ($i = 0; $i < count($var); $i++) {
echo $var[$i]."\n";
}
то вывод будет
2
5
, в этом случае, каждый элемент в массиве имеет узнаваемый индекс, но если Вы тогда делаете что-то как следующий
$var = array_push($var,10);
for ($i = 0; $i < count($var); $i++) {
echo $var[$i]."\n";
}
, Вы не получаете вывода. Это происходит, потому что массивы в PHP не являются линейными структурами как, они находятся на большинстве языков. Они больше похожи на хэш-таблицы, которые могут или не могут иметь ключей для всех сохраненных значений. Следовательно foreach не использует индексы для проверки по ним, потому что у них только есть индекс, если массив определяется. Если у Вас должен быть индекс, удостоверьтесь, что Ваши массивы полностью определяются прежде, чем проверить по ним и используют для цикла.
Если вы используете XPath, то это ограничение XPath и , а не PHP. Посмотрите это объяснение на xpath и пространствах имен по умолчанию для получения дополнительной информации.
В частности, это атрибут xmlns = ""
в корневом узле, который вызывает проблему. Это означает, что вам необходимо зарегистрировать пространство имен, а затем использовать QName для ссылки на элементы.
$feed = simplexml_load_file('http://www.sitepoint.com/recent.rdf');
$feed->registerXPathNamespace("a", "http://www.domain.com/schema/data");
$result = $feed->xpath("a:Data/a:Something/...");
Важно :
Чтобы полностью удалить пространство имен, вам необходимо использовать регулярные выражения (RegEx). Например:
$feed = file_get_contents("http://www.sitepoint.com/recent.rdf");
$feed = preg_replace("/<.*(xmlns *= *[\"'].[^\"']*[\"']).[^>]*>/i", "", $feed); // This removes ALL default namespaces.
$xml_feed = simplexml_load_string($feed);
Затем вы удалили все пространства имен xml перед загрузкой XML (будьте осторожны с регулярным выражением, потому что, если у вас есть какие-либо поля с чем-то вроде:
<![CDATA[ <Transfer xmlns="http://redeux.example.com">cool.</Transfer> ]]>
, тогда он удалит xmlns изнутри CDATA что может привести к неожиданным результатам.