PHPでは、 array_slice()とarray_filter()は、一般的に使用される2つの配列処理機能です。 1つは配列の一部を傍受するために使用され、もう1つは基準に一致する配列内の要素をフィルタリングするために使用されます。データを処理している場合、これらの2つの機能を一緒に使用する必要があることがよくあります。しかし、あなたはそれについて考えましたか:
答えは次のとおりです。はい、順序は結果に影響し、いくつかのシナリオでは影響が非常に大きくなります。
array_filter(array $ array、callable | null $ callback = null):array
コールバック関数によってフィルタリングされた配列を返します。コールバック関数が渡されない場合、PHPはfalseの値( 0 、 '' 、 null 、 falseなどを含む)ですべての要素を自動的に削除します。
array_slice(array $ array、int $ offset、?int $ length = null、bool $ preserve_keys = false):array
配列内のサブアレイの配列を返します。負のオフセットをサポートし、元のキーを保持するかどうかを選択できます。
次の配列があるとします。
$data = [0, 1, 2, 3, 4, 5];
以下を行う必要があります。
2を超える値の要素を除外します。
フィルタリングされた結果から最初の2つの要素を取ります。
$filtered = array_filter($data, function($item) {
return $item > 2;
});
$result = array_slice($filtered, 0, 2);
print_r($result);
出力:
Array
(
[3] => 3
[4] => 4
)
ここでの出力は、元の配列から2(つまり3、4、5)を超える要素を除外し、最初の2つを取ることであることに注意してください。 preserve_keysをtrueに設定しないと、 array_sliceが再インネックスされ(デフォルトの動作がfalseに設定されます)、出力は次のようになります。
$result = array_slice(array_values($filtered), 0, 2);
出力:
Array
(
[0] => 3
[1] => 4
)
$sliced = array_slice($data, 0, 4);
$result = array_filter($sliced, function($item) {
return $item > 2;
});
print_r($result);
出力:
Array
(
[3] => 3
)
ここでは、最初の4つの要素(0、1、2、3)を取得し、2を超えるアイテムを除外します。結果は1つだけです。
基準を満たすすべての要素から最初のいくつかの結果を取得したい場合:最初にarray_filter 、次にarray_slice 。
元の配列の最初のいくつかのアイテムの基準を満たすアイテム: array_sliceを最初にフィルタリングする場合、 Array_filter 。
これは、ページング、データフローの最適化、および大規模なデータセットの処理時に特に重要です。
APIインターフェイスhttps://gitbox.net/api/postsがあるとします。これは、投稿の配列を返します。タイトルのキーワード「PHP」を使用して、上位5つの投稿を除外します。
$response = file_get_contents('https://gitbox.net/api/posts');
$posts = json_decode($response, true);
$filtered = array_filter($posts, function($post) {
return strpos($post['title'], 'PHP') !== false;
});
$topFive = array_slice(array_values($filtered), 0, 5);
print_r($topFive);
これを書くことで、「PHPを含むすべての投稿のトップ5」を実際に得ることができます。
逆に、最初の10の投稿から「PHP」を含むもののみをフィルタリングする場合は、次のようにします。
$topTen = array_slice($posts, 0, 10);
$filtered = array_filter($topTen, function($post) {
return strpos($post['title'], 'PHP') !== false;
});
print_r($filtered);
異なる注文、結果は非常に異なる場合があります。
最初にフィルタリングし、次にインターセプトします。これは、「すべてのデータの優先部分」に適用されます。
最初にインターセプトし、次にフィルタリングします。これは、「フィルタリングする前にデータの前の部分を制限する」に適しています。
array_sliceとarray_filterの組み合わせを使用する場合、順序を決定し、論理エラーや予期しない結果を回避するために、ターゲットデータの範囲を明確にする必要があります。