Array_combineは、最初の配列としてキー、2番目の配列は値として2つのアレイをパラメーターとして受信します。 2つの配列の長さが異なる場合、警告がスローされ、 Falseが返されます。
$keys = ['name', 'email', 'age'];
$values = ['Alice', '[email protected]', 30];
$result = array_combine($keys, $values);
// 出力:['name' => 'Alice', 'email' => '[email protected]', 'age' => 30]
print_r($result);
従来のforeach執筆方法と比較して、この方法はよりコンパクトで、コードはより読みやすくなります。
Associativeアレイを構築するためにEachを使用することも一般的な方法です。コードは次のとおりです。
$keys = ['name', 'email', 'age'];
$values = ['Alice', '[email protected]', 30];
$result = [];
foreach ($keys as $index => $key) {
$result[$key] = $values[$index];
}
このアプローチの利点は柔軟性であり、データのフォーマットや特定の値のスキップなど、ビルドプロセス中に論理処理を追加できます。
パフォーマンスの観点から、 Array_combineはC言語で実装された内部関数であり、少量のデータを扱う際にギャップはほとんどありません。ただし、大きなアレイ(数千のキー価値ペアなど)を扱う場合、通常、Manual Foreachよりもわずかに優れたパフォーマンスを発揮します。
ただし、パフォーマンスの改善は数桁の違いではなく、通常、数百万の反復で明らかです。ベンチマークの簡単な例を次に示します(参照のみ):
$keys = range(1, 100000);
$values = range(100001, 200000);
// 使用 array_combine
$start = microtime(true);
array_combine($keys, $values);
echo 'array_combine: ' . (microtime(true) - $start) . "s\n";
// 使用 foreach
$start = microtime(true);
$result = [];
foreach ($keys as $i => $key) {
$result[$key] = $values[$i];
}
echo 'foreach: ' . (microtime(true) - $start) . "s\n";
ほとんどの場合、 Array_combineはわずかに優れていますが、2つの違いは5〜10%を超えません。
2つのアレイの長さが同じで、データ構造が安定していると確信している場合、 Array_combineを使用することはより賢明な選択です。コードが短いだけでなく、エラーの確率が低いです。
$userFields = ['id', 'name', 'email'];
$userData = [101, 'John Doe', '[email protected]'];
$user = array_combine($userFields, $userData);
データベースによって返された配列やユーザーが別の入力などのデータの不整合の可能性がある場合は、 Eachを使用して検証ロジックを追加することをお勧めします。
$result = [];
$minLength = min(count($keys), count($values));
for ($i = 0; $i < $minLength; $i++) {
$result[$keys[$i]] = $values[$i];
}
または、後続のトラブルシューティングのためのロギング:
if (count($keys) !== count($values)) {
error_log("一貫性のない配列長: keys(" . count($keys) . "), values(" . count($values) . ")");
}
場合によっては、 Array_mapとArray_combineを同時に使用して、チェーン処理能力を向上させることができます。
$raw = ['John', '[email protected]', 28];
$keys = ['name', 'email', 'age'];
$user = array_combine($keys, array_map('trim', $raw));
この方法は、簡潔なものであり、Nestsデータの前処理ロジックです。