Повторяющаяся функция PHP не отображается - синтаксическая ошибка
Я хочу сделать выбор категории и подкатегории - поэтому, когда я нажимаю на категорию, рядом с ней отображаются все подкатегории.
Я сделал это работать с HTML и JS, но теперь я делаю это на моем сайте динамично
это то, что я использую сейчас
var categories_0 = [
<?php while ( fanapom_has_categories() ) { ?>
["<?php echo fanapom_category_id() ; ?>","<?php echo fanapom_category_name() ; ?>"],
<?php } ?>
];
<?php while ( fanapom_has_categories() ) { ?>
var categories_<?php echo fanapom_category_id() ; ?> = [<?php while ( fanapom_has_subcategories() ) { ?>["<?php echo fanapom_category_id() ; ?>","<?php echo fanapom_category_name() ; ?>"],<?php } ?>];
<?php } ?>
Но я использовал этот код два раза, но я вижу, что он работает только один раз.
<?php while ( fanapom_has_categories() ) { ?>
если я буду использовать это один
var categories_0 = [
<?php while ( fanapom_has_categories() ) { ?>
["<?php echo fanapom_category_id() ; ?>","<?php echo fanapom_category_name() ; ?>"],
<?php } ?>
];
или это одно
<?php while ( fanapom_has_categories() ) { ?>
var categories_<?php echo fanapom_category_id() ; ?> = [<?php while ( fanapom_has_subcategories() ) { ?>["<?php echo fanapom_category_id() ; ?>","<?php echo fanapom_category_name() ; ?>"],<?php } ?>];
<?php } ?>
Я получаю правильный вывод
но когда я смешиваю их вместе, я получаю только вывод первого,
Как я могу заставить это работать, чтобы дать мне правильный вывод? Я думаю, что я не должен использовать этот код два раза
<?php while ( fanapom_has_categories() ) { ?>
Но я не уверен, как смешать их вместе - Пожалуйста, помогите.
БОЛЬШЕ ИНФОРМАЦИИ
Вот то, что я хочу, чтобы вывод был похож
var categories_0 = [
["1", "maincategoryname"],
["2", "maincategoryname"],
["3", "maincategoryname"],
["4", "maincategoryname"],
["5", "maincategoryname"],
["6", "maincategoryname"],
["7", "maincategoryname"],
["8", "maincategoryname"]
];
var categories_1 = [
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"]
];
var categories_2 = [
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"]
];
var categories_3 = [
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"]
];
var categories_4 = [
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"]
];
var categories_5 = [
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"]
];
var categories_6 = [
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"]
];
var categories_7 = [
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"]
];
var categories_8 = [
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"],
["subcategoryid", "subcategoryname"]
];
1 2 3 4 5 6 7 8 номеров являются номерами основной категории
2 ответа
Вот как распечатать многомерные массивы javascript в вашем примере, если предположить, что источником данных является похожий многомерный массив в PHP:
$categories = array(
"1" => array("one", array("1" => "a", "2" => "b", "3" => "c"))
, "2" => array("two", array("4" => "d", "5" => "e", "6" => "f"))
, "3" => array("three", array("7" => "g", "8" => "h", "9" => "i"))
);
$categories_js = 'var categories_0 = [';
$category_subs_js = '';
$delimiter1 = '';
$delimiter2 = '';
foreach ( $categories as $category_id => $category_info ) {
$categories_js .= $delimiter1 . '["' . $category_id . '", "' . $category_info[0] . '"]';
$delimiter1 = ', ';
$category_subs_js .= 'var categories_' . $category_id . ' = [';
foreach ( $category_info[1] as $subcat_id => $subcategory ) {
$category_subs_js .= $delimiter2 . '["' . $subcat_id . '", "' . $subcategory . '"]';
$delimiter2 = ', ';
}
$category_subs_js .= "];\n";
$delimiter2 = '';
}
$categories_js .= "];\n";
echo $categories_js;
echo $category_subs_js;
Ваш fanapom_has_
функции, вероятно, используют итератор, который не позволит вам получить список во второй раз. (Причина #422835, почему изменяемое глобальное состояние является злом, кстати. Если у вас есть выбор, я бы порекомендовал вам сделать свой API менее зависимым от них. Тот факт, что WordPress делает это, не означает, что это хорошая идея.)
Чтобы это исправить, вам нужно либо каким-то образом сбросить итератор, либо создать массивы для основной категории и каждой подкатегории одновременно (так что вам нужен только один проход по списку).
Честно говоря, вам лучше прекратить пукать, собирая JSON вручную.:P PHP имеет встроенную функцию, json_encode
, чтобы сделать это. Все, что вам нужно сделать, это построить массивы. И вы можете сделать это за один проход.
Возможно что-то вроде
<?php
$categories = [ [] ];
while (fanapom_has_categories()) {
$id = fanapom_category_id();
$categories[0][] = [ "$id", fanapom_category_name() ];
$categories[$id] = [];
while (fanapom_has_subcategories()) {
# btw, this looks odd to me, using the same function to get info on the
# category and subcategory, but using different functions to iterate through
# the respective lists.
$categories[$id][] = [ fanapom_category_id(), fanapom_category_name() ];
}
}
foreach ($categories as $id => $subcategories) {
echo "var categories_$id = ", json_encode($subcategories), ";\n";
}
?>
(Заметка: [ item1, item2 ]
это PHP 5.4 spiff. Если вы застряли на старой версии PHP, используйте array(item1, item2)
вместо.)