Проблема использования foreach и цикла for в PHP - PullRequest
2 голосов
/ 12 марта 2019

У меня есть 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»; где мне его поставить?

ТИА

Ответы [ 5 ]

5 голосов
/ 12 марта 2019

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

<?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 голосов
/ 12 марта 2019

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

$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

2 голосов
/ 12 марта 2019

Вы можете упростить ваш цикл, поскольку хотите выполнять итерацию по обоим массивам одновременно. Таким образом, предполагая, что $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 голос
/ 12 марта 2019

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

$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;
0 голосов
/ 12 марта 2019

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

foreach ($array1 as $key => $a1) {
  echo ($key === 1 ? " while " : ($key > 1 ? " and " : "")) . "$array2[$key] has $a1";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...