【问题标题】:combined foreach not displaying all array values in PHP组合foreach不显示PHP中的所有数组值
【发布时间】:2012-12-10 04:34:00
【问题描述】:

我正在尝试使用 foreach 循环显示 2 个数组,但由于某种原因,当数组中的值设置为 0 时,仅显示数组的最后一项

假设我有以下数组值:

users array ( 0 => user1, 1 => user2)
occurrences array ( 0 => 0, 1 => 3)   //the key represents the user from the users array

foreach 循环的输出会正确显示

//output
user1 0
user2 3

但是,如果两个值都为 0,则只会显示 user2

users array ( 0 => user1, 1 => user2)
occurrences array ( 0 => 0, 1 => 0);   //the key represents the user from the users array

//output (should also display user1 0)
user2 0

这是我的 foreach 循环。

?>
<table>
<th>User</th><th># of Occurrences</th>
<?
foreach (array_combine($occurrences, $users) as $occur => $user){
    ?>
    <tr><td><? echo $user; ?></td><td><? echo $occur; ?></td></tr>
    <?
}
?></table>
<?

【问题讨论】:

    标签: php foreach


    【解决方案1】:

    问题中的代码执行以下操作:

    为每个出现值键,提供一个用户。

    我想你是在相反的行为之后:

    为每个用户键,提供一个出现值

    尝试在通话中交换$occurrences$users,即,

    array_combine($users, $occurrences)

    您只看到 user2 的原因是 array_combine 考虑条目 0 =&gt; 0 and 1 =&gt; 0 并将接收 0 0 作为密钥列表。因此,它只能在结果数组哈希中产生一个键(它使用出现数组中的值来构建键列表)。

    【讨论】:

      【解决方案2】:
      $users = array(1 => 'user2', 0 => 'user1');
      $occurences = array(0 => 0, 1 => 3);
      
      $count = count($users);
      $result = array();
      for($i = 0; $i < $count; $i++)
      {
        $result[$users[$i]] = $occurences[$i];
      }
      var_dump($result);
      

      注意 $users 数组顺序。使用 array_combine,在这种情况下你会得到错误的值。

      array (size=2)
        'user1' => int 0
        'user2' => int 3
      

      我无法重现你所说的:

      var_dump(array_combine([0 => 'user_1', 1 => 'user_2'], [0 => 0, 1 => 0]));
      

      结果:

      array (size=2)
        'user_1' => int 0
        'user_2' => int 0
      

      【讨论】:

      • 那么 for 循环是要走的路吗?用户数组将始终与出现的顺序相同。我使用 sql 查询中的 array_push 将值插入到数组中。它们永远不会像你给出的例子那样被颠倒过来。无论如何,一个 for 循环是有效的。我仍然不明白为什么它没有显示两个用户。
      • @user1852176 还有其他方法,但我会“手动”执行,如果您不完全熟悉函数,则不能依赖它。我假设 $key 是用户和事件之间的链接,所以在这种情况下,顺序无关紧要,如果你使用一些 array_* 函数,我相信它会的。
      • @user1852176 你像说的那样颠倒了数组。
      【解决方案3】:

      尝试以这样的方式来做这件事怎么样:

      <?php
      foreach($users as $userId => $userName) {
       if(isset($occurrences[$userId])) {
      ?>
        <tr><td><?php echo $userName; ?></td><td><?php echo $occurrences[$userId]; ?></td></tr>
      <?php
      }
      ?>
      

      【讨论】:

      • 这会将数组的值相加,因此输出完全不同。
      • 好点,我现在修改了我的答案,因为我理解得更好了。
      【解决方案4】:

      如果您的键只是跟随数字,为什么还要使用关联数组?

      这对我有用:

      <?php 
      $user = array('user1','user2');
      $occur = array(0,0);
      
      foreach (array_combine($user, $occur) as $key => $value) {
          echo $key . " : " . $value;
      }
       ?>
      

      【讨论】:

        【解决方案5】:

        如果两个值都是 0

        然后,对于两个不同的值,您有两个相同的键,并用第二个值覆盖第一个值;因此,在数组中,只有一个值

        【讨论】:

          【解决方案6】:

          PHP 将$occurances 中的 组合起来,用作生成的组合数组中的数组键。由于您已将 0 指定为两次值,user2 将始终假定数组中的第一个位置。

          对于您的解决方案,这不是更好吗:

          foreach($occurances as $userindex => $occurs)
          {
              echo '<tr><td>'.$users[$userindex].'</td><td>'.$occurs.'</td></tr>';
          }
          

          【讨论】:

            【解决方案7】:

            为什么不这样做

            if(count($occurrences)==count($users)){
                foreach($occurences as $k, $v){
                    ?><tr><td><? echo $users[$k]; ?></td><td><? echo $v; ?></td></tr><?
                }
            }
            

            确认两个数组的大小匹配,然后达到所需的输出。

            【讨论】:

            • 因为$occurrences.length == length...if 语句始终为真。而且您正在使用短标签。我想你的问题可能应该是“为什么”......:P
            • @BenM 什么?请解释一下你的意思,因为这没有任何意义。
            • 在服务器上运行您的代码。 echo $occurences.length; 输出字符串 length。因此,您正在比较两个字符串,它们都是length
            • >.
            猜你喜欢
            • 1970-01-01
            • 2012-05-28
            • 2010-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多