Position actuelle: Accueil> Derniers articles> Discussion sur l'ordre de Array_slice et Array_Filter

Discussion sur l'ordre de Array_slice et Array_Filter

gitbox 2025-05-20

Dans PHP, array_slice () et array_filter () sont deux fonctions de traitement de la table couramment utilisées. L'un est utilisé pour intercepter une partie d'un tableau, et l'autre est utilisé pour filtrer les éléments du tableau qui correspondent aux critères. Lorsque nous traitons les données, nous devons souvent utiliser ces deux fonctions ensemble. Mais avez-vous pensé à cela:

La réponse est: oui, l'ordre affectera les résultats , et dans certains scénarios, l'impact est très important.

Un bref examen de la fonction introduction

  • array_filter (array $ array, callable | null $ callback = null): array
    Renvoie le tableau filtré par la fonction de rappel. Si la fonction de rappel n'est pas adoptée, PHP supprimera automatiquement tous les éléments avec une valeur de faux (y compris 0 , '' , null , false , etc.).

  • array_slice (array $ array, int $ offset ,? int $ length = null, bool $ preserve_keys = false): array
    Renvoie une gamme de sous-terrains dans le tableau. Prend en charge les décalages négatifs et vous pouvez choisir de conserver la clé d'origine.

Exemple d'analyse

Supposons que nous ayons le tableau suivant:

 $data = [0, 1, 2, 3, 4, 5];

Nous devons faire ce qui suit:

  1. Filtrez des éléments avec des valeurs supérieures à 2;

  2. Prenez les deux premiers éléments du résultat filtré.

Array_filter puis array_slice

 $filtered = array_filter($data, function($item) {
    return $item > 2;
});
$result = array_slice($filtered, 0, 2);
print_r($result);

Sortir:

 Array
(
    [3] => 3
    [4] => 4
)

Notez que la sortie ici est de filtrer les éléments supérieurs à 2 (c'est-à-dire 3, 4, 5) du tableau d'origine, puis de prendre les deux premiers. Si vous ne définissez pas Preserve_Keys sur true , Array_slice sera réindexé (le comportement par défaut de le régler sur false ) et la sortie deviendra:

 $result = array_slice(array_values($filtered), 0, 2);

Sortir:

 Array
(
    [0] => 3
    [1] => 4
)

Array_slice d'abord et array_filter

 $sliced = array_slice($data, 0, 4);
$result = array_filter($sliced, function($item) {
    return $item > 2;
});
print_r($result);

Sortir:

 Array
(
    [3] => 3
)

Ici, nous prenons les 4 premiers éléments (0, 1, 2, 3), puis filtrons les éléments supérieurs à 2, et il n'y a qu'un seul résultat: 3 .

Quel ordre est le plus approprié?

  • Si vous souhaitez prendre les premiers résultats de tous les éléments qui répondent d'abord aux critères : array_filter , alors array_slice .

  • Si vous souhaitez filtrer les éléments qui répondent aux critères des premiers éléments du tableau d'origine : array_slice d'abord, alors array_filter .

Ceci est particulièrement critique lors de la pagination, de l'optimisation du flux de données et du traitement de grands ensembles de données.

Exemples d'applications dans des scénarios réels

Supposons que vous ayez une interface API https://gitbox.net/API/Posts , qui renvoie un tableau de messages. Vous souhaitez filtrer les 5 principaux messages avec le mot-clé "PHP" dans le titre:

 $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);

L'écriture ceci garantit que vous obtenez vraiment "les cinq premiers de tous les articles contenant PHP".

Inversement, si vous souhaitez filtrer uniquement ceux contenant "PHP" des 10 premiers messages que vous retournez:

 $topTen = array_slice($posts, 0, 10);
$filtered = array_filter($topTen, function($post) {
    return strpos($post['title'], 'PHP') !== false;
});

print_r($filtered);

résumé

  • Différentes commandes, les résultats peuvent être très différents.

  • Filtrez d'abord puis intercepter, qui est applicable aux "parties préférées de toutes les données";

  • Intercepter d'abord puis filtrer, qui convient pour "limiter la partie précédente des données avant le filtrage".

Lorsque vous utilisez la combinaison de Array_Slice et Array_Filter , vous devez clarifier la portée de vos données cibles, afin de déterminer l'ordre et d'éviter les erreurs logiques ou les résultats inattendus.