-1

PHPで単純な配列を動的に構築しています。

配列を作成するときのキーの順序は次のとおりです (例として)。

  • A6
  • A1
  • C7
  • "" (または NULL)
  • 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 '&gt;'.$row3['team'].'&lt;<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」の順序で表示されます

4

2 に答える 2

1

他の人が述べているように、これはforeach.

しかし、mysql_query の結果からデータを取得していることに気付きました。ほとんどの場合、結果として得られる SQL クエリの注文です。

SQL ステートメントに手動で を入れなくてもORDER BY、MySQL はいくつかの基準、特に要求されたテーブルの主キーに従って結果を並べ替えます。したがって、配列キー$row3['team']が DB テーブルの主キーである場合、これが最も可能性の高い説明です。

編集:スクリプト出力で更新を見ました。うーん...確かに奇妙な.. 2つの観察:

  • インデックスとしての空の文字列は地獄のように醜いです、私はPHPがそれを許可していることに驚いています
  • 特定の状況でのみデバッグ インデックスを出力します。クエリ結果に同じteam値の複数の行が含まれている可能性がありますか? 配列内のいくつかのインデックスの値が複数回上書きされている場合、php がどのインデックスを最新として使用するかわかりません
于 2012-04-12T12:55:00.210 に答える
0

私は間違っているかもしれませんが、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
于 2012-04-12T12:28:44.173 に答える