Повторяющаяся функция 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) вместо.)

Другие вопросы по тегам