Почему условие не возвращается после того, как оно встретилось на php?

Я придумал следующий код:

<?php
if (block_rows('option') : while ( block_rows( 'option' ) ) : block_row( 'option' ); 
                                
    if ( !isset($id) ) { // meet only on the first iteration
        $a = 1; 
    }
    elseif ( isset($id) && $id == block_sub_value('ID') ) {
        $a++;
    }
    elseif ( isset($id) && $id != block_sub_value('ID') ) {
        $a = 2;
    }

    $id = block_sub_value('ID');
?>

    <h1> Option - <?=$id;?> </h1> // prints only the ID
    <p> Sub Option - <?=$id . ' - ' . $a;?> <p> prints ID and the $a

<?php endwhile; endif;?>

Логика, которую я пытаюсь построить, такова:

  • Если это первая итерация цикла, $a должно быть равно 1. Период.
  • Если $id и $a равны, увеличьте значение $a на 1.
  • И, наконец, если $id и $a разные, $a должно быть равно 2.

У меня есть список с некоторыми родительскими заголовками с номером $id и дочерним содержимым, имеющим родительский номер $id, а также номер $a. Что-то вроде:

Почему условие не возвращается после того, как оно встретилось на php?

Пункт, который не работает хорошо, на самом деле является первым условием. Самая первая $a начинается с 2, а не с 1, почти как если бы после выполнения первого условия функция продолжала проверять остальные, заменяя значение $a. Я не знаю, почему это происходит.

ваше 3-е правило устанавливает $a равным 2, оно должно установить его равным 1

Iłya Bursov 05.05.2022 03:05

Не может, потому что, как показано на рисунке, только дочерний элемент первого родителя может иметь 1. Все остальные должны начинаться с 2. Это то, что правило, которое устанавливает $a = 1, только если $id не установлен (первая итерация) это для.

Lucas M. Falbo 05.05.2022 03:13

Я неправильно понял вопрос, каков текущий выход и что ожидается?

Iłya Bursov 05.05.2022 03:18

Первый дочерний элемент уже печатал число 2, несмотря на правило, согласно которому, если $id еще не установлен, $a должен быть равен единице. Почему-то это правило не работало. Но я решил проблему, изменив всю логику.

Lucas M. Falbo 05.05.2022 14:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После того, как вы запустили цикл while и прошли первую итерацию, значение isset($id) равно true и поэтому не будет сброшено до 1.

Следовательно, измените часть:

<?php
if (block_rows('option') : while ( block_rows( 'option' ) ) : block_row( 'option' ); 
                                
    if ( !isset($id) ) { // meet only on the first iteration
        $a = 1; 
    }
// the rest of the code

на что-то вроде:

<?php

// set initial $oldid to be a value which is not possible
$oldid = "-100";

if (block_rows('option') : while ( block_rows( 'option' ) ) : block_row( 'option' ); 
                                
    if ( $oldid !=$id ) { // meet only on the first iteration
        $oldid=$id;
        $a = 1; 
    }
// the rest of the code (please further amend if logically requires)

Это только один из способов. Надеюсь, что это даст вам некоторые идеи

Это точное решение по какой-то причине не сработало, но оно дало мне аналогичную идею, которая сработала. Спасибо, брат!

Lucas M. Falbo 05.05.2022 14:04

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