组合foreach不显示PHP中的所有数组值

时间:2012-12-09 19:59:49

标签: php foreach

我正在尝试使用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>
<?

7 个答案:

答案 0 :(得分:1)

$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

答案 1 :(得分:1)

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

  

对于每个出现值键,请提供用户。

我会想象你是在追求相反的行为:

  

对于每个用户密钥,请提供出现值

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

array_combine($users, $occurrences)

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

答案 2 :(得分:0)

尝试以某种方式这样做:

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

答案 3 :(得分:0)

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

这对我有用:

<?php 
$user = array('user1','user2');
$occur = array(0,0);

foreach (array_combine($user, $occur) as $key => $value) {
    echo $key . " : " . $value;
}
 ?>

答案 4 :(得分:0)

  

如果两个值均为0

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

答案 5 :(得分:0)

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

对于你的解决方案,这不会更好:

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

答案 6 :(得分:-1)

为什么不

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

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