0

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

7 回答 7

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
于 2012-12-09T20:07:33.863 回答
1

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

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

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

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

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

array_combine($users, $occurrences)

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

于 2012-12-09T20:11:48.870 回答
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
}
?>
于 2012-12-09T20:01:26.557 回答
0

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

这对我有用:

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

foreach (array_combine($user, $occur) as $key => $value) {
    echo $key . " : " . $value;
}
 ?>
于 2012-12-09T20:10:13.867 回答
0

如果两个值都为 0

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

于 2012-12-09T20:11:04.317 回答
0

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

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

foreach($occurances as $userindex => $occurs)
{
    echo '<tr><td>'.$users[$userindex].'</td><td>'.$occurs.'</td></tr>';
}
于 2012-12-09T20:11:38.953 回答
-1

为什么不做

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

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

于 2012-12-09T20:09:57.543 回答