我正在用PHP动态构建一个简单的数组。
当我构建数组时,键顺序是这样的(作为示例):
- 答6
- 答1
- C7
- "(或空)
- B3
然而,当我通过 foreach()
引用数组时,数组是有序的(","A1","A6","B3","C7")。
通过foreach()
处理时如何保留数组的原始顺序?
我假设键顺序是它的构建方式,但似乎要么foreach()
索引顺序,要么在此过程中的某个地方排序。
感谢您的帮助。
代码狡猾
// loop through 3rd set of query results
echo '<pre>'; /*this is here for my debugging*/
while ($row3 = mysql_fetch_array($result)) {
if (empty($teamName[$row3['team']])) {
$teamName[$row3['team']] = $row3['name'];
echo '>'.$row3['team'].'<<br />'; /*this is here for my debugging*/
}
if ($row3['id'] == $_SESSION['authenticated']['id']) $cssStyle = ' myPick';
else $cssStyle = NULL;
$html[$row3['team']] .= '<li class="bcPicks' . $cssStyle . '">';
$html[$row3['team']] .= '<span class="bcPicks_displayName">' . $row3['displayName'] . '</span>';
if (!empty($row3['team'])) {
$html[$row3['team']] .= ' in ';
$html[$row3['team']] .= '<span class="bcPicks_paddingA">' . $row3['games'] . '</span>';
}
else {
$html[$row3['team']] .= '<span class="bcPicks_paddingB"></span>';
}
if ($row3['points'] < 0) $cssStyle = 'negative';
else $cssStyle = 'positive';
$html[$row3['team']] .= '(<span class="bcPicks_' . $cssStyle . '">' . signedNumber($row3['points']) . ' points</span>)';
$html[$row3['team']] .= '</li>';
} // end while() loop through 3rd set of query results
// free-up memory
mysql_free_result($result);
print_r($html);echo '</pre>';var_dump($html);exit; /*this is here for my debugging*/
foreach ($html as $key => $value) {...}
我可以告诉你,我的print_r()
和var_dump()
都表明,从foreach()
出来的秩序不是它建立的方式。
这是数组的转储
>E5<
>E4<
><
Array
(
[] =>
name1(0 points)
[E4] =>
name2 in 5(-2 points)
name3 in 6(-2 points)
name4 in 7(-2 points)
name5 in 7(-2 points)
name6 in 7(-2 points)
name7 in 7(-2 points)
name7 in 7(-2 points)
[E5] =>
name9 in 4(+8 points)
name10 in 7(+8 points)
name11 in 7(+8 points)
)
array(3) { [""]=> string(158) "
name1(0 points)
" ["E4"]=> string(1156) "
name2 in 5(-2 points)
name3 in 6(-2 points)
name4 in 7(-2 points)
name5 in 7(-2 points)
name6 in 7(-2 points)
name7 in 7(-2 points)
name8 in 7(-2 points)
" ["E5"]=> string(495) "
name9 in 4(+8 points)
name10 in 7(+8 points)
name11 in 7(+8 points)
" }
上面你可以看到它被构建为"E5"、"E4"和 NULL然而,数组转储以 NULL、"E4"和"E5"顺序显示它
正如其他人所说,这不可能是由foreach
引起的。
但我注意到您从mysql_query结果中获取数据。很可能您的 SQL 查询会订购该结果。
即使您没有手动将ORDER BY
放入SQL语句中,MySQL也会根据某些条件对结果进行排序,尤其是所请求表的主键。因此,如果您的数组键$row3['team']
是数据库表中的主键,这是最可能的解释。
编辑:刚刚看到您的脚本输出更新。嗯。。。确实很奇怪..两个观察结果:
- 一个空字符串作为索引是丑陋的,我很惊讶 php 允许它
- 您只在某些情况下打印调试索引,查询结果是否具有相同的
team
值的多行?我不确定哪个索引 php 会用作最新的索引,如果数组中的某些索引多次覆盖其值
我可能是错的,但我相信 PHP 中的关联数组是作为字典实现的,其中键的顺序无法保证。您可以改用这样的数据结构,使用索引数组:
$array = array(
array("A6", "bar"),
array("A1", "foo"),
);
然后像这样使用它:
foreach($array as $v)
$v[0] // this contains the key
$v[1] // this contains the value