【问题标题】:Echo array inside foreach and if isset but only show one data for each valueforeach 和 if isset 内的回显数组,但每个值仅显示一个数据
【发布时间】:2018-07-17 17:20:47
【问题描述】:

所以我有这个数组列表(我出于隐私目的更改了值);

$datalist  = array(
1 => 
array(
     "12.2.2.2",
     "Netherlands 1",
     "Hub 1",
     "Password",
     "Mfalse"
) ,
array(
    "12.2.2.2",
    "Singapore 1",
    "Hub 2",
    "Password 2",
    "Mfalse"
) 

我想要 array2 的输出,即“集线器”和“集线器 2”。所以我做了这个 php 代码,因为我希望它在一个表中循环,这样所有的细节都将被列出和组织。但我现在唯一需要的是显示 HUB。

                foreach ($response->monitors as $monitors) {
                    if(isset($monitors->id)){
                      echo
                      '<tr>
                      <td><i class="fas fa-globe"></i> '.$monitors->friendly_name.'</td>';
                           foreach ($datalist as $key => $value) {
                            # code...
                            if (isset($key)) {
                               echo '<td>'.$value[2].'</td>';
                            }
                        }
                      echo '<td>'.$monitors->url.'</td>
                      <td>'.$monitors->status.'</td>
                      </tr>';
                    }
                  }

由于我还使用其他值输出,并且我想要的数组也在表的另一个 foreach 循环中。

所以主要问题在于这部分,因为每当我使用它时,它在表格的每个循环上都会像这样输出

foreach ($datalist as $key => $value) {
                        # code...
                        if (isset($key)) {
                           echo '<td>'.$value[2].'</td>';
                        }
                    }

输出:

Netherlands 1 Hub 1 Hub 2 12.2.2.2 
Singapore   1 Hub 1 Hub 2 12.2.2.2 

但我正在寻找的期望输出是;

Netherlands 1 Hub 1 12.2.2.2 
Singapore   1 Hub 2 12.2.2.2 

我的 foreach 数组语句有什么问题?

$datalist 的 var_dump

array (
1 => 
array (
 0 => 'x',
 1 => 'Netherlands 1',
 2 => 'PeenoiseSync',
 3 => 'x',
 4 => 'Mfalse',
),
2 => 
array (
 0 => 'x',
 1 => 'Singapore 1',
 2 => 'PeenoiseSync',
 3 => 'x',
 4 => 'Mfalse',
),
3 => 
array (
 0 => 'x',
 1 => 'Singapore 2',
 2 => 'PeenoiseSync',
 3 => 'x',
 4 => 'Mfalse',
),
 4 => 
 array (
  0 => 'x',
  1 => 'Singapore 3',
  2 => 'PeenoiseSync',
  3 => 'x',
  4 => 'Mfalse',
 ),
 5 => 
 array (
  0 => 'x',
  1 => 'Singapore 4',
  2 => 'PeenoiseSync',
  3 => 'x',
  4 => 'Mfalse',
 ),
 6 => 
 array (
  0 => 'x',
  1 => 'Singapore 5',
  2 => 'PeenoiseSync',
  3 => 'x',
  4 => 'Mfalse',
 ),
 7 => 
 array (
  0 => 'x',
  1 => 'Singapore 6',
  2 => 'PeenoiseSync',
  3 => 'x',
  4 => 'Mfalse',
 ),
 8 => 
 array (
  0 => 'x',
  1 => 'Singapore 7',
  2 => 'YTAC',
  3 => 'x',
  4 => 'Mfalse',
 ),
)

再次更新:所需的输出应该与此类似;

我得到的输出;

【问题讨论】:

  • $monitors->friendly_name 这会输出什么?
  • @AlbertoVidales 我正在使用正常运行时间机器人 api,它输出一些名称,如 SG-1 等。
  • 我的问题是,该变量是否与数组中的位置 1 值相同?
  • var_dump($datalist); 发布结果,以便我们了解它是如何实际构建的。如果需要,您可以删除某些值,但不要尝试手写整个内容。这总是很糟糕,并导致提供的信息很差。
  • @PatrickQ 添加了 $datalist 的 var 转储;

标签: php arrays if-statement foreach


【解决方案1】:

此答案假定您的 $datalist 数组与您的 $monitors 数组的顺序相同,并且包含相同数量的元素。您只需要跟踪您在哪个监视器上,然后使用相同的索引来访问相应的$datalist 行。您可以通过设置as $index=&gt;$monitors 然后使用$datalist[$index][2] 来做到这一点

// re-indexing $datalist since in your example it is not 0-indexed
$datalist = array_values($datalist);
foreach ($response->monitors as $index=>$monitors) {
    if(isset($monitors->id)){
        echo
            '<tr>
             <td><i class="fas fa-globe"></i> '.$monitors->friendly_name.'</td>';
        echo '<td>'.$datalist[$index][2].'</td>';

        echo '<td>'.$monitors->url.'</td>
            <td>'.$monitors->status.'</td>
            </tr>';
    }
}

【讨论】:

  • 确实是一个好方法,但是如果它们的顺序不同,这可能会导致关系数据混乱。
  • @AlbertoVidales 这就是我序言的重点。如果它们的顺序不同,那么 OP 就是一条小河,因为记录之间似乎没有可识别的共享值。
  • 似乎很容易找出他是否能够做他想做的事,只需要确切知道 $monitors 有什么(只有一项),这样我们就可以知道要比较什么为了帮助他,但好吧,我会留到这里。
  • @Sync 您问题中提供的$datalist 缺少[0] 索引。这对于数字索引数组来说是很奇怪的。但是,您可以简单地运行 $datalist = array_values($datalist); 来解决此问题。我会更新我的答案以反映。
  • @Sync 很高兴为您提供帮助。
【解决方案2】:

您在密码 2 后漏掉了一个 "

$datalist  = array(
1 => 
array(
     "12.2.2.2",
     "Netherlands 1",
     "Hub 1",
     "Password",
     "Mfalse"
) ,
array(
    "12.2.2.2",
    "Singapore 1",
    "Hub 2",
    "Password 2",
    "Mfalse"
)
);

foreach ($datalist as $key => $value) {
                        # code...
                        if (isset($key)) {
                           echo '<td>'.$value[2].'</td>';
                        }
                    }

在这里测试

http://phpfiddle.org

【讨论】:

  • 哦,抱歉,这是我在编辑代码时的错误,但实际代码中包含“。我会立即修复它。
【解决方案3】:

您将需要一个变量来比较 $monitors 和 $value[1] 因为每次 $monitors 迭代都会输出 $datalist 中的所有数组信息,我将举例说明如何解决这个问题,但是在为了进一步帮助您,我需要知道 $monitors->friendly_name 究竟输出了什么以及您在 $monitors 变量中拥有什么(也许我们可以使用一些东西来比较和匹配与正确监视器相对应的 $datalist 数组:

foreach ($datalist as $key => $value) {
    # code...
    if ($monitors->friendly_name == $value[1]) {
        echo '<td>'.$value[2].'</td>';
    }

假设 $key 始终设置(我认为 foreach 不会在迭代中设置 $key),这将输出与该特定监视器的正确数组值匹配的值

【讨论】:

  • $monitors 被我正在调用的另一个 api 使用,它不是我要输出的数组的一部分。 $monitors 按预期正常工作,只有数组有问题,可能是因为我对循环的论点或其他原因。
  • 我知道您无法控制监视器数据,只需尝试找到一个变量,您可以将 $monitors 与每个数组元素进行比较,在这种情况下,如果值是同样,它会输出与该监视器相关的正确数据,如果不是,它只会进入下一个直到找到它,一旦是真的记得离开你的 foreach,这样你就不会在找到后浪费资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2014-05-24
  • 1970-01-01
  • 2014-05-21
  • 2012-08-15
  • 2023-03-08
  • 2012-05-28
相关资源
最近更新 更多