Структуры управления

if

$score = 50;
if ($score >= 40){
  echo 'A';
} // классика

// если действие только одно, допустимо не использовать фигурные скобки. Но зачем?
if ($score >= 40)
  echo 'A';

// else
if ($score >= 40){
  echo 'A';
} else {
  echo 'Если условие не выполняется';
}

//elseif

if ($score >= 40){
  echo 'A';
  if($score == 41){
    echo 'И вложенные условия допустимы';
  }
} elseif ($score >= 30){
  echo 'Доп. условий может быть сколько угодно';
} else {
  echo 'Если ни одно из условий не выполняется';
}

// для работы с html
<body>
<?php $score = 95; ?>
<?php if($score >= 90 ): ?>
<p>Some text</p>
<?php elseif($score >= 80): ?>
<p>Some text</p>
<?php else: ?>
<p>Some text</p>
<?php endif ?>
</body>

While

$i = 0;
while ($i <= 15){ //сначала проверка выражения а потом выполнение
  echo $i++;
}

// бесконечный цикл
while(true){
  if($i >= 15){
    break; // может быть break 2; или больше. 
           // Цифра отвечает за кол-во вложенных (родительских) циклов которые будут завершены
  }
  echo $i++;
}

// прогулки по итерациям
while($i <= 15){
  if($i % 2 === 0){
    $i++;
    continue; // переход к следующей итерации и пропуск всего остального
              // может быть continue 3; и пропустит 3 итерации
  }
  echo $i++;
}
// альтернативный вариант записи
while($condition):
  ...
endwhile;

do-while

do { // будет выполнено хотя бы раз в любом случае
  echo $i++; 
} while($i <= 15); // проверка только после выполнения

for

for( $i = 0; $i < 15; $i++){
  echo $i;
}

for( $i = 0; print $i, $i < 15; $i++){
  // вполне допустимо, сам цикл учитвыает последние условие в разделе (в цикле их 3)
}

//можно использовать для перебора строк или массивов
$text = 'Hello World!';
for($i =0; $i < strlen($text); $i++;){
  echo $text[$i];
}

$text = ['a','b','c'];
for($i =0; $i < count($text); $i++;){
  echo $text[$i];
}
// стоит учитывать что условие в цикле проверяется каждый раз
// и если там есть функция count() то расчеты будут повторяться
// лучше избегать подобного, к примеру

$text = ['a','b','c'];
$lenght = count($text);
for($i =0; $i < $lenght; $i++;){
  echo $text[$i];
}

// можно и в тело цикла поместить ибо первая часть выполняется лишь раз
for($i =0, $lenght = count($text) ; $i < $lenght; $i++;){
  echo $text[$i];
}

//альтернативный вариант записи
for($i =0; $i < $lenght; $i++;):
  ...
endfor;

foreach

$languages = ['php','java','c++','go'];

foreach($languages as $language){
  echo $language; // Отдельный элемент массива, идут по порядку
}

foreach($languages as $key => $language){
  echo $key; // ключ элемента массива
}

// изменение элементов массива в цикле с указанием ссылки
foreach($languages as $key => &$language){
  $language = 'anyValue'; // при этом изменится и сам массив
}

// после цикла &$language не будет уничтожено и останется доступным в остальном коде
echo $language; // anyValue
$language = 'anotherValue'; //изменение произойдет
unset($language); //крайне желательно очистить ссылку

//перебор массива
$user = [
  'name' => 'SomeName',
  'email' => 'some@mail',
  'dataArray' => [1,2,3],
];

//если хотим просто вывести все что есть
foreach($user as $key => $value){
  echo $key . ':' . json_encode($value) . '<br />';
}
//или так
foreach($user as $key => $value){
  if(is_array($value)){
    $value = implode(',', $value);
  }
  echo $key . ':' . $value . '<br />';
}

//альтернативный вариант записи
foreach($user as $key => $value):
  ...
endforeach;

switch

$paymentStatus = 'paid';

// сравнения проходят в нестрогом режиме, как при == 
// аккуратнее с case 1:

switch($paymentStatus){
  case 'paid':
    echo 'Paid';
    break;    // если операция не будет прервана то выполнится следующие действие
              // независимо от проверки условия
    
  case 'declined':
    echo 'Payment Declined';
    break;
    
  default: // не требуется по умолчанию, 
           // switch не будет выполняться вовсе если не найдет нужного case
    echo 'Uncnown Payment Status';
}

// на случай если несколько условий делают одно и то же
switch($paymentStatus){
  case 'paid':
    echo 'Paid';
    break;    

  case 'declined':
  case 'rejected': //и так сколько угодно раз
    echo 'Payment Declined';
    break;
}

// взаимодействия с циклами

foreach($some as $value){
  switch($value){
    case 1:
      echo 'anyTextOrFN';
      break;  // тут выход только из switch
              // для завершения цикла  break 2;
              // continue 2; только так, потому что работать оно должно для цикла
    case ...
  }
}

// если хотим как то реагировать на результат функции то 
function x(){
  ... 
  return $value;
}

switch(x()){ // это лучше чем городить elseif
  ...
}

match

// введено с php 8
// использует строгое сравнение === 
$statusText = match($paymentStatus){
  1 => 'Paid',
  2 => x(),  // но только одно действие, в switch сколько угодно
  3,4,5 => 'Буквально как OR',
  default: => 'Uncnown Payment Status', // должно быть обязательно для избежания ошибок
}