PHPでは、 array_filter()は非常に一般的に使用される配列処理機能であり、主に配列内の要素をフィルタリングするために使用されます。この関数は、保持する必要がある要素を定義するオプションのコールバック関数を受信できます。コールバック関数が提供されていない場合、 array_filter()は、 false 、 null 、 0 、空の文字列、空の配列などの「false値」で配列内の要素を自動的に削除します。
質問は、実際に使用して、デフォルトの動作を使用してarray_filter()を使用することとカスタムコールバック関数を提供することのパフォーマンスの違いは何ですか?どの方法がより効率的ですか?
この記事では、これら2つの使用法の実行時間を比較およびテストすることにより、パフォーマンスの観点から詳細な分析を行います。
// デフォルトの動作:配列を削除します“偽の価値”
$result = array_filter($array);
// コールバック関数を使用します:より大きいだけを保持します 0 の値
$result = array_filter($array, function($value) {
return $value > 0;
});
多数の要素を含む配列を構築し、それぞれデフォルトの動作とカスタムコールバック関数を使用してそれらをフィルタリングします。
function testArrayFilterDefault($array) {
$start = microtime(true);
$result = array_filter($array);
return microtime(true) - $start;
}
function testArrayFilterCallback($array) {
$start = microtime(true);
$result = array_filter($array, function($value) {
return $value > 0;
});
return microtime(true) - $start;
}
// テスト配列を作成します,含む 100000 要素
$testArray = [];
for ($i = 0; $i < 100000; $i++) {
$testArray[] = $i % 2 === 0 ? 0 : $i; // 半分です 0,半分です整数
}
// テストを実行します
$timeDefault = testArrayFilterDefault($testArray);
$timeCallback = testArrayFilterCallback($testArray);
echo "デフォルトの動作执行时间:{$timeDefault} 2番\n";
echo "コールバック関数実行時間:{$timeCallback} 2番\n";
上記のスクリプトを実行すると、ほとんどの場合、デフォルトの動作がより速く実行されることがわかります。理由は次のとおりです。
デフォルトの動作は、C言語層によって実装されるロジックが組み込まれており、実行効率が高くなっています。
コールバック関数を使用する場合、PHPは毎回ユーザー定義の関数を呼び出す必要があり、特に大量のデータの場合、関数呼び出しのオーバーヘッドは無視できません。
サンプル出力(特定のマシンによってわずかに異なる):
デフォルトの動作执行时间:0.012345 2番
コールバック関数実行時間:0.035678 2番
ご覧のとおり、デフォルトの動作は約2〜3倍高速です。
デフォルトの動作は優れていますが、制限があります - 「false値」のみを削除できます。フィルタリングロジックが特定の範囲の値、タイプチェックなどを保持するなど、少し複雑である場合、コールバック関数が必要です。
例えば:
// 奇妙な値を保持します
array_filter($array, function($v) {
return $v % 2 !== 0;
});
これは明らかにデフォルトの動作によって達成することはできません。
$userInput = [
'name' => 'Alice',
'email' => '',
'age' => 0,
'newsletter' => false,
];
$cleanedInput = array_filter($userInput); // 只保留非偽の価値字段
// 出力 ['name' => 'Alice']
この例では、すべての未充填フィールド(偽、空の文字列などを含む)をすべて削除する場合、デフォルトの動作は非常に適切です。また、空でない文字列フィールドのみを保存する場合は、コールバックを使用する必要があります。
$cleanedInput = array_filter($userInput, function($value) {
return is_string($value) && trim($value) !== '';
});
使い方 | パフォーマンス | 柔軟性 | シナリオを使用します |
---|---|---|---|
デフォルトの動作 | ?効率的 | ?制限付き | 虚偽の値を削除します |
コールバック関数を使用します | ?少し遅い | ?フレキシブル | カスタムフィルタリングロジック |
提案:誤った値を削除するだけの場合は、デフォルトの動作を使用します。より複雑なロジックが必要な場合は、コールバック関数を使用することは避けられません。
関連タグ:
array_filter