Здравствуйте, товарищи. У меня затруднение с выводом <title> и заголовка страницы (<h1>). Суть в следующем. В xml-документе (который представляет собой страницу одной категории) есть узел с id категории, к которой пренадлежит данная страница (<catid>). ID — целое число (1, 2, 3 и т. д.). Имена же категорий хранятся в xml-документе со списком категорий (значение атрибута узла <category> — label="имя_категории"). На странице «Список категорий» — список ссылок на категории. Следовательно, при клике на одну из ссылок переходим на страницу конкретной категории со списком статей. На такой странице конечно должен быть заголовок с названием категории. Вот его-то мне и не удается вывести. Как мне кажется, нужно каким-то образом определить id страницы и подгрузить из файла с именами категорий значение атрибута «label» тега <category>. Структура такого файла такова: Код (Text): <categories> <category id="cat_id" label="cat_label" /> <…и т. д.… /> </categories> Вот такая конструкция выводит список вообще всех категорий: Код (Text): <h1><?php $cats = simplexml_load_file($fileDir . 'categories.xml'); foreach ($cats->category as $cat) { echo '<p>' . htmlentities($cat['label']) . '</p><br />'; } ?></h1> К сожалению, это все, на что хватило ума. Всю ночь копошился, так ни к чему и не пришел. Очень надеюсь на помощь форумчан.
Страшно показывать Вот чего говорит: Код (Text): object(SimpleXMLElement)#2 (1) { ["category"]=> array(6) { [0]=> object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "6" ["label"]=> string(22) "Server Side Essentials" ["status"]=> string(4) "live" } } [1]=> object(SimpleXMLElement)#7 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "7" ["label"]=> string(15) "Test Category 1" ["status"]=> string(4) "live" } } [2]=> object(SimpleXMLElement)#8 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "8" ["label"]=> string(15) "Test Category 2" ["status"]=> string(4) "live" } } [3]=> object(SimpleXMLElement)#9 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "9" ["label"]=> string(15) "Test Category 3" ["status"]=> string(4) "live" } } [4]=> object(SimpleXMLElement)#10 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "10" ["label"]=> string(15) "Test Category 4" ["status"]=> string(4) "live" } } [5]=> object(SimpleXMLElement)#11 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "11" ["label"]=> string(15) "Test Category 5" ["status"]=> string(4) "live" } } } } Server Side Essentialsobject(SimpleXMLElement)#2 (1) { ["category"]=> array(6) { [0]=> object(SimpleXMLElement)#5 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "6" ["label"]=> string(22) "Server Side Essentials" ["status"]=> string(4) "live" } } [1]=> object(SimpleXMLElement)#10 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "7" ["label"]=> string(15) "Test Category 1" ["status"]=> string(4) "live" } } [2]=> object(SimpleXMLElement)#9 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "8" ["label"]=> string(15) "Test Category 2" ["status"]=> string(4) "live" } } [3]=> object(SimpleXMLElement)#8 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "9" ["label"]=> string(15) "Test Category 3" ["status"]=> string(4) "live" } } [4]=> object(SimpleXMLElement)#7 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "10" ["label"]=> string(15) "Test Category 4" ["status"]=> string(4) "live" } } [5]=> object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "11" ["label"]=> string(15) "Test Category 5" ["status"]=> string(4) "live" } } } } Test Category 1object(SimpleXMLElement)#2 (1) { ["category"]=> array(6) { [0]=> object(SimpleXMLElement)#11 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "6" ["label"]=> string(22) "Server Side Essentials" ["status"]=> string(4) "live" } } [1]=> object(SimpleXMLElement)#7 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "7" ["label"]=> string(15) "Test Category 1" ["status"]=> string(4) "live" } } [2]=> object(SimpleXMLElement)#8 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "8" ["label"]=> string(15) "Test Category 2" ["status"]=> string(4) "live" } } [3]=> object(SimpleXMLElement)#9 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "9" ["label"]=> string(15) "Test Category 3" ["status"]=> string(4) "live" } } [4]=> object(SimpleXMLElement)#10 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "10" ["label"]=> string(15) "Test Category 4" ["status"]=> string(4) "live" } } [5]=> object(SimpleXMLElement)#5 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "11" ["label"]=> string(15) "Test Category 5" ["status"]=> string(4) "live" } } } } Test Category 2object(SimpleXMLElement)#2 (1) { ["category"]=> array(6) { [0]=> object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "6" ["label"]=> string(22) "Server Side Essentials" ["status"]=> string(4) "live" } } [1]=> object(SimpleXMLElement)#10 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "7" ["label"]=> string(15) "Test Category 1" ["status"]=> string(4) "live" } } [2]=> object(SimpleXMLElement)#9 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "8" ["label"]=> string(15) "Test Category 2" ["status"]=> string(4) "live" } } [3]=> object(SimpleXMLElement)#8 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "9" ["label"]=> string(15) "Test Category 3" ["status"]=> string(4) "live" } } [4]=> object(SimpleXMLElement)#7 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "10" ["label"]=> string(15) "Test Category 4" ["status"]=> string(4) "live" } } [5]=> object(SimpleXMLElement)#11 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "11" ["label"]=> string(15) "Test Category 5" ["status"]=> string(4) "live" } } } } Test Category 3object(SimpleXMLElement)#2 (1) { ["category"]=> array(6) { [0]=> object(SimpleXMLElement)#5 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "6" ["label"]=> string(22) "Server Side Essentials" ["status"]=> string(4) "live" } } [1]=> object(SimpleXMLElement)#7 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "7" ["label"]=> string(15) "Test Category 1" ["status"]=> string(4) "live" } } [2]=> object(SimpleXMLElement)#8 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "8" ["label"]=> string(15) "Test Category 2" ["status"]=> string(4) "live" } } [3]=> object(SimpleXMLElement)#9 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "9" ["label"]=> string(15) "Test Category 3" ["status"]=> string(4) "live" } } [4]=> object(SimpleXMLElement)#10 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "10" ["label"]=> string(15) "Test Category 4" ["status"]=> string(4) "live" } } [5]=> object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "11" ["label"]=> string(15) "Test Category 5" ["status"]=> string(4) "live" } } } } Test Category 4object(SimpleXMLElement)#2 (1) { ["category"]=> array(6) { [0]=> object(SimpleXMLElement)#11 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "6" ["label"]=> string(22) "Server Side Essentials" ["status"]=> string(4) "live" } } [1]=> object(SimpleXMLElement)#10 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "7" ["label"]=> string(15) "Test Category 1" ["status"]=> string(4) "live" } } [2]=> object(SimpleXMLElement)#9 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "8" ["label"]=> string(15) "Test Category 2" ["status"]=> string(4) "live" } } [3]=> object(SimpleXMLElement)#8 (1) { ["@attributes"]=> array(3) { ["id"]=> string(1) "9" ["label"]=> string(15) "Test Category 3" ["status"]=> string(4) "live" } } [4]=> object(SimpleXMLElement)#7 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "10" ["label"]=> string(15) "Test Category 4" ["status"]=> string(4) "live" } } [5]=> object(SimpleXMLElement)#5 (1) { ["@attributes"]=> array(3) { ["id"]=> string(2) "11" ["label"]=> string(15) "Test Category 5" ["status"]=> string(4) "live" } } } } Test Category 5
Ну вот, если с форматированием вывести var_dump( $cats ) (чтоб не страшно было), тоесть перед этим сделать echo '<pre>', то там будет понятно как добраться до нужной вам переменной: Код (Text): if ( $cat['id'] == $my_needle_id ) ... хочется без перебора, но видимо не получится, удобнее было бы просто Код (Text): echo $cats->category[$my_needle_id]->label но кажысь структура массивов не та
Ничего не соображу. Вроде бы все вполне логично: Код (Text): <?php $cats = simplexml_load_file($fileDir . 'categories.xml'); foreach ($cats->category as $cat) { if ( $cats->category['id'] == $cat_id ) { echo $cats->category[$cat_id]->label; } } ?> Не?
Так и не удалось мне ничего вывести. Прямо беда… Уже почти неделю не могу справиться. Товарищи, поспособствуйте решить мою проблему! Очень нужно! В остальном я вроде бы разобрался, своими силами.
Выводите зависимости от старшей к младшей, пока не найдете ошибку foreach ($cats->category as $cat) { if ( $cats->category['id'] == $cat_id ) { Зачем же вам тогда $cat, если вы все равно обращаетесь к массиву категорий? У меня чувство, что должно быть if ($cat->attributes['id'] == $cat_id) или как-то так.
Спасибо, Хыиуду, вроде удалось. Вот таким образом: Код (Text): <h1> <?php $cats = simplexml_load_file($fileDir . 'categories.xml'); foreach ($cats->category as $cat) { if ((string)$cat['id'] == $_GET['catid']) { echo $cat['label']; } } ?> </h1> Хотел только спросить. Это синтаксически верно или по-нубски?
Нормально. Хотя можно было бы попробовать XPath использовать, чтоб без цикла. http://www.w3schools.com/xpath/default.asp http://phpfiddle.org/main/code/c3ms-cevb
Код (PHP): <?php $xml = <<<XML <categories> <category id="1" label="Метка" /> <category id="2" label="Метка 2" /> </categories> XML; $s = new SimpleXMLElement($xml); $cat = $s->xpath("//category[@id='2']"); echo $cat[0]['label']; ?>
mkramer, спасибо! Тут еще возникла задачка. Нужно бы по-хорошему выводить имя (label) категории на странице статьи. Т. е., нужно указывать к какой категории принадлежит страница. Как то (пример): Флора советского Дальнего востока 12.10.2014__________________________________Категория: Определители растений СССР _______________________________________________________________________________ <!-- Контент --> Предыдущая конструкция сего не выводит. Страница со статьей выводится так: Код (Text): <h1><?php echo htmlentities($inner->headline); ?></h1> <div id="introduction"> <?php if (count($inner->xpath('description'))) { echo $hy_ru->hyphenate($inner->description, 'UTF-8'); } ?> </div> <div id="content"> <?php if (count($inner->xpath('text'))) { echo $hy_ru->hyphenate($inner->text, 'UTF-8'); } ?> </div> Если использовать Код (Text): <?php echo htmlentities($inner->categoryid); ?> выводится конечно только id категории, к которой относится эта статья, т. е., в данном случае — «6». Подскажите, как приспособить предыдущий код (который выводит заголовок с именем категории) в данном случае?
А сами никак не можете догадаться: Код (PHP): $cat = $s->xpath("//category[@id='$inner->categoryid']"); echo $cat[0]['label']; Естественно, в $s должен быть SimpleXMLElement с категориями
Код (PHP): <?php $s = simplexml_load_file($fileDir . 'categories.xml'); ?> <h1><?php echo htmlentities($inner->headline); ?></h1> <div id='category'> <?php $cat = $s->xpath("//category[@id='$inner->categoryid']"); echo $cat[0]['label']; ?> </div> <div id="introduction"> <?php if (count($inner->xpath('description'))) { echo $hy_ru->hyphenate($inner->description, 'UTF-8'); } ?> </div> <div id="content"> <?php if (count($inner->xpath('text'))) { echo $hy_ru->hyphenate($inner->text, 'UTF-8'); } ?> </div>
Спасибо, mkramer — все работает. А первый кусок кода должен выглядеть примерно так: Код (Text): <?php $s = simplexml_load_file($fileDir . 'categories.xml'); $cat = $s->xpath("//category[@id='catid']"); echo $cat[0]['label']; ?> или не то совсем? Честно говоря, у меня с ним не выводится заголовок. Вот, пытаюсь сообразить как его исправить
Если catid - это переменная, то перед ней должен быть $: Код (Text): $cat = $s->xpath("//category[@id='$catid']"); Прежде чем писать всякое разное, почему бы не почитать чтой-нибудь про язык, на котором пишите?
Да, я вот все читаю, но php дается мне с невероятной сложностью. Код все-таки не работает. Я о том, что был в изначальном вопросе. Вот этот: <?php Код (Text): $xml = <<<XML <categories> <category id="1" label="Метка" /> <category id="2" label="Метка 2" /> </categories> XML; $s = new SimpleXMLElement($xml); $cat = $s->xpath("//category[@id='2']"); echo $cat[0]['label']; ?> здесь очевидно должна быть некая переменная «@id=' … '» ?
Вместо двойки - да, должна быть. А сам код я проверил - я же дал ссылку на phpfiddle, всё работает Добавлено спустя 3 минуты 56 секунд: http://phpfiddle.org/main/code/e8x8-3prh