0

私は昨日ヘッドスクラッチャーを持っていました。

<select>基本的に、オプションとしてボックスに入れる文字列キー(数値を含みますが、引用符で囲まれた文字列を含む)を含むいくつかのデータの連想配列がありました。選択ボックスのオプションにプレースホルダー値を追加したかったのです。

array_mergeを使おうとしました:

$placeholder = "Month";
$source = array
(
    '01' => '01 - January',
    '02' => '02 - February',
    '03' => '03 - March',
    '04' => '04 - April',
    '05' => '05 - May',
    '06' => '06 - June',
    '07' => '07 - July',
    '08' => '08 - August',
    '09' => '09 - September',
    '10' => '10 - October',
    '11' => '11 - November',
    '12' => '12 - December'
);

$source = array_merge(array('' => $placeholder), $source);

そして、私は奇妙な結果を見ていました-結果の$source配列は次のようになりました:

(
    '' => 'Month',
    '01' => '01 - January',
    '02' => '02 - February',
    '03' => '03 - March',
    '04' => '04 - April',
    '05' => '05 - May',
    '06' => '06 - June',
    '07' => '07 - July',
    '08' => '08 - August',
    '09' => '09 - September',
    0 => '10 - October',
    1 => '11 - November',
    2 => '12 - December'
);

何らかの理由で、10月から12月に自動インクリメントの整数キーのように見えるものを使用し始めたことに注意してください。

array_merge呼び出しを次のように置き換えることができます。

$source = array('' => $placeholder) + $source;

また、配列のキーが再生成されず、すべてが正常ですが、この場合のシーンで何が起こっているのかわかりませんarray_merge

使用したときに配列キーに何が起こったのか説明してもらえますarray_mergeか?ありがとう!

4

3 に答える 3

5

機能に問題はありませんarray_merge()

マージする前に印刷$sourceすると、次のようになります。

array(12) {
  ["01"]=>
  string(12) "01 - January"
  ["02"]=>
  string(13) "02 - February"
  // ...
}

最初のキーの名前をに変更してみてください。'01''1'のようになります。

array(12) {
  [1]=>
  string(12) "01 - January"
  ["02"]=>
  string(13) "02 - February"
  // ...
}

PHPはキーを整数に自動変換します。しかし、なぜそれが行われるのかは言えません。

編集 :

私はphp.net( PHP.net )で答えを見つけました:

キーは整数または文字列のいずれかです。キーが整数の標準表現である場合、そのように解釈されます(つまり、「8」は8として解釈され、「08」は「08」として解釈されます)。キーのフロートは整数に切り捨てられます。インデックス付き配列タイプと連想配列タイプはPHPの同じタイプであり、整数インデックスと文字列インデックスの両方を含めることができます。

于 2012-01-03T16:17:44.477 に答える
1

マニュアルで非常に明確に説明されています:

数字キーの番号が付け直されることを忘れないでください!

aで始まらないキーは'0'、PHPによって数値と見なされるため、番号が付け直されます。

于 2012-01-03T16:11:41.347 に答える
0

ドキュメントのいくつかのポイントは、これの説明につながります:

array_mergeから:

数値キーを使用した入力配列の値は、ゼロから始まる増分キーで番号が付け直されます。

そして配列から:

キーは整数または文字列のいずれかです。キーが整数の標準表現である場合、そのように解釈されます(つまり、「8」は8として解釈され08」は「08」として解釈されます)。

これは、最初のキーが数値キーとして表示されないため、インデックスが再作成されない理由を説明しています。他のキーは数字キーとして表示されます。

于 2012-01-03T16:23:53.483 に答える