最も一般的な間違いの1つは、 $ keysパラメーターに渡された値が配列ではないことです。たとえば、文字列または番号を渡す:
<span><span><span class="hljs-variable">$keys</span></span><span> = </span><span><span class="hljs-string">'abc'</span></span><span>; </span><span><span class="hljs-comment">// 間違い:配列の代わりに文字列を通過します</span></span><span>
</span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill_keys</span></span><span>(</span><span><span class="hljs-variable">$keys</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>); </span><span><span class="hljs-comment">// 警告をトリガーします</span></span><span>
</span></span>回避策: $ keysパラメーターが有効な配列であることを確認してください。タイプがわからない場合は、 is_array()を使用して確認できます。
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_array</span></span><span>(</span><span><span class="hljs-variable">$keys</span></span><span>)) {
</span><span><span class="hljs-variable">$keys</span></span><span> = (</span><span><span class="hljs-keyword">array</span></span><span>) </span><span><span class="hljs-variable">$keys</span></span><span>; </span><span><span class="hljs-comment">// アレイのアレイの値を配列にキャストします</span></span><span>
}
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill_keys</span></span><span>(</span><span><span class="hljs-variable">$keys</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>);
</span></span>$ valueパラメーターのタイプは実際には厳密には必要ありませんが、場合によっては、合格した値は予期しない結果につながる可能性があります。たとえば、オブジェクトまたはリソースタイプのデータを渡すと、出力が予想よりも悪化する可能性があります。
<span><span><span class="hljs-variable">$keys</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span>];
</span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'file.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>); </span><span><span class="hljs-comment">// 間違い:リソースタイプの値</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill_keys</span></span><span>(</span><span><span class="hljs-variable">$keys</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>);
</span></span>回避策: $値のタイプが配列の要素値として適切であることを確認してください。予測不可能なタイプの場合、これはタイプチェックによって回避できます。
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_resource</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>)) {
</span><span><span class="hljs-variable">$value</span></span><span> = (</span><span><span class="hljs-keyword">string</span></span><span>)</span><span><span class="hljs-variable">$value</span></span><span>; </span><span><span class="hljs-comment">// リソースタイプを文字列に変換します</span></span><span>
}
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill_keys</span></span><span>(</span><span><span class="hljs-variable">$keys</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>);
</span></span>array_fill_keysはあらゆるタイプのキー(文字列、整数などを含む)をサポートしますが、いくつかのシナリオでは、キーの混合がアレイまたは理解できない動作に矛盾を引き起こす可能性があります。特に、オブジェクトをキー名として使用する場合、オブジェクトのハッシュ値( __hash() )のためにキーの矛盾が発生する場合があります。
回避策:非シリアル化されたオブジェクトをキー名として使用しないでください。配列$キー内の各要素が、文字列または整数に正しく変換されることが保証されます。
<span><span><span class="hljs-variable">$keys</span></span><span> = [</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">stdClass</span></span><span>(), </span><span><span class="hljs-string">'b'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span>]; </span><span><span class="hljs-comment">// 間違い:オブジェクトタイプのキー</span></span><span>
</span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill_keys</span></span><span>(</span><span><span class="hljs-variable">$keys</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>); </span><span><span class="hljs-comment">// 出力は予測不可能です</span></span><span>
</span></span>単純なデータ型をキーとして使用するのが最善です。
<span><span><span class="hljs-variable">$keys</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span>]; </span><span><span class="hljs-comment">// 正しい:すべてのキーは文字列です</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill_keys</span></span><span>(</span><span><span class="hljs-variable">$keys</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>);
</span></span>array_fill_keys関数のエラーが発生したり、出力が期待を満たしていない場合、デバッグは非常に重要なステップです。デバッグの提案は次のとおりです。
var_dump出力変数を使用してください:着信$キーと$ valueが期待を満たしているかどうかを確認します。
エラーログの表示:PHPのエラーログは、通常、パラメーターの合格問題を見つけるのに役立ちます。
debug_backtraceを使用したデバッグ関数コールスタック:複雑なアプリケーションでは、関数コールスタックは、関数パラメーターの合格に関する特定の問題を見つけるのに役立ちます。