Проблема с использованием foreach и цикла for в PHP

#php #for-loop #foreach

#php #цикл for #foreach

Вопрос:

У меня есть 2 вида МАССИВОВ

 <?php
    $array1 = array("Car", "House", "Money");
    $array2 = array("John", "Peter", "Mary");

foreach ($array1 as $a1) {
    for($i = 0; $i < count($array2); $i  ) {
        if ($a1 === end($array1 )) {
          echo $array2[$i].' has '.$a1.'.<br>';
        }
        else {
          echo $array2[$i].' has '.$a1.',<br>';
        }
    }
}
?>
  

Но результат выглядит следующим образом

 John has Car,
Peter has Car,
Mary has Car,
John has House,
Peter has House,
Mary has House,
John has Money.
Peter has Money.
Mary has Money.
  

То, что я хочу, похоже на это

 John has Car,
Peter has House, 
Mary has Money.
  

есть ли какой-либо другой способ?

за исключением вызова определенного значения массива, подобного этому

 $array1[0]."has ".$array2[0].",<br>"
$array1[1]." has ".$array2[1].",<br>" 
$array1[2]." has ".$array2[2].".<br>"
  

если мне нужно использовать «break;», куда я должен это поместить?

TIA

Комментарии:

1. привязаны ли массивы к 3 элементам?

2. Нет. Данные в БД будут храниться в массиве 1, но данные в массиве 2 исправлены

Ответ №1:

Пожалуйста, проверьте мой полезный для вас ответ.

 <?php
    $array1 = array("Car", "House", "Money");
    $array2 = array("John", "Peter", "Mary");

for($i = 0; $i < count($array2); $i  ) {

          echo $array2[$i].' has '.$array1[$i].'.<br>';

    }

?>
  

и вывод, как показано ниже:

У Джона есть машина. У Питера есть дом. У Мэри есть деньги.

Ответ №2:

Вам не нужно выполнять цикл дважды. Вы можете просто выполнить итерацию по списку пользователей и использовать данный ключ для доступа к соответствующему объекту:

 $objects = ['Car', 'House', 'Money'];
$people = ['John', 'Peter', 'Mary'];

foreach ($people as $i => $person) {
  echo $i > 1 ? ' and ' : '', $person, ' has ', $objects[$i];
}
  

Демонстрация: https://3v4l.org/Fa45t

Обратите внимание, что это предполагает, что два массива имеют одинаковый размер. Вы можете использовать array_key_exists (или isset в данном случае), чтобы убедиться, в противном случае.

Обновлено после вашей правки. Это обрабатывает случай, когда людей больше, чем объектов:

 $objects = ['Car', 'House', 'Money'];
$people = ['John', 'Peter', 'Mary', 'Paul'];

foreach ($people as $i => $person) {
  if (!array_key_exists($i, $objects)) {
    break;
  }
  echo ($i > 0 ? ',<br>' : ''), $person, ' has ', $objects[$i];
}
  

Демонстрация: https://3v4l.org/Hd3e0

Комментарии:

1. Я внес некоторые изменения. Что, если элементу массива не присвоено значение 3? Спасибо за ваш ответ. В настоящее время я пытаюсь исправить ваш код в свой код, чтобы посмотреть, работает ли это.

2. после настройки вашего кода под мой. наконец-то это сработало!. Спасибо

3. @JerickArcega Нет проблем. Я только что обновил свой ответ рабочим примером, где объектов больше, чем людей.

Ответ №3:

Вы можете упростить свой цикл, поскольку хотите выполнять итерации по обоим массивам одновременно. Итак, предполагая, что $array1 и $array2 имеют одинаковое количество значений, вы можете использовать что-то вроде этого. Сравнивая индекс с количеством элементов в массиве, мы решаем, выводить ли «while», «and» или ничего после каждой фразы.

 foreach ($array2 as $key => $value) {
    if (!isset($array1[$key])) continue;
    echo "$value has $array1[$key]";
    echo $key < count($array2) - 2 ? " while " : ($key < count($array2) - 1 ? " and " : "");
}
  

Вывод:

 John has Car while Peter has House and Mary has Money
  

Обновить

На основе изменений OPs код может быть упрощен до этого, что включает проверку наличия соответствующего объекта для каждого пользователя (приведенный выше код был отредактирован аналогичным образом):

 foreach ($array2 as $key => $value) {
    if (isset($array1[$key])) echo "$value has $array1[$key]";
}
  

Демонстрация на 3v4l.org

Комментарии:

1. Я внес некоторые изменения. Что, если элементу массива не присвоено значение 3? Спасибо за ваш ответ. В настоящее время я пытаюсь исправить ваш код в своем коде, чтобы посмотреть, работает ли это

2. @JerickArcega Я внес изменения, чтобы справиться с ситуацией, когда людей может быть больше, чем объектов. Но я рад видеть, что у вас уже есть ответ Jeto, который сработает для вас.

Ответ №4:

Вы также можете найти решение ниже

 $output_string = '';
 for($i = 0; $i < count($array1); $i  ) {
    for($j = 0; $j < count($array2); $j  ) {
        if($i == $j){
            $output_string .=  $array2[$i]." has ".$array1[$i];
        }
    }
    if(!empty($output_string)){
        if($i == 0){
            $output_string .= " while  ";
        }else{
            if($i<(count($array1) -1)){
                $output_string .= " and  ";
            }            
        }             
    }
}
echo $output_string;
  

Комментарии:

1. Я внес некоторые изменения. Спасибо за ваш ответ. В настоящее время я пытаюсь исправить ваш код в своем коде, чтобы посмотреть, работает ли это

Ответ №5:

Поместите цикл for внутрь вашего цикла foreach следующим образом:

 foreach ($array1 as $key => $a1) {
  echo ($key === 1 ? " while " : ($key > 1 ? " and " : "")) . "$array2[$key] has $a1";
}
  

Комментарии:

1. Это в значительной степени точная копия ответа @Jeto.