【问题标题】:Problem using foreach and for loop in PHP在 PHP 中使用 foreach 和 for 循环的问题
【发布时间】:2019-08-02 14:40:49
【问题描述】:

我有两种阵列

<?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

【问题讨论】:

  • 数组是否固定为 3 个元素?
  • 没有。 DB中的数据将存储在array1中,但array2中的数据是固定的

标签: php for-loop foreach


【解决方案1】:

您不需要循环两次。您可以简单地遍历人员列表并使用给定的键来访问相应的对象:

$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

【讨论】:

  • 我做了一些改变。如果数组的元素不固定为 3 怎么办?谢谢您的回答。我目前正在尝试将您的代码修复到我的代码中,看看它是否有效。
  • 在调整您的代码以适合我的代码之后。它终于奏效了!谢谢
  • @JerickArcega 没问题。我刚刚用一个工作示例更新了我的答案,其中对象比人多。
【解决方案2】:

您可以简化循环,因为您想同时遍历两个数组。因此,假设 $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]";
}

Demo on 3v4l.org

【讨论】:

  • 我做了一些改变。如果数组的元素不固定为 3 怎么办?谢谢您的回答。我目前正在尝试将您的代码修复到我的代码中,看看它是否有效
  • @JerickArcega 我已经做出改变以应对人多于物体的情况。但我很高兴看到您已经得到 Jeto 的答案来为您工作。
【解决方案3】:

请检查我的回答对你有帮助。

<?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>';

    }

?>

输出如下:

约翰有车。 彼得有房子。 玛丽有钱。

【讨论】:

    【解决方案4】:

    将 for 循环 放到 foreach 循环 中,如下所示:

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

    【讨论】:

    • 这几乎是@Jeto 答案的精确副本。
    【解决方案5】:

    你也可以下面的解决方案

    $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;
    

    【讨论】:

    • 我做了一些改变。谢谢您的回答。我目前正在尝试将您的代码修复到我的代码中,看看它是否有效
    猜你喜欢
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2014-05-13
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多