2 votes

Supprimer les données dans le tableau de réponse avec php

J'ai un tableau comme dans l'exemple. Avec le code que j'ai écrit, j'obtiens une sortie comme dans Output1.

Question: Je demande un service différent de mon application. La réponse est un tableau et il contient des informations d'identifiant. Il y a une fonction de permission () pour le contrôle d'autorisation. La fonction de permission renvoie des privilèges d'utilisateur en tant que true et false. Mais je n'ai pas pu écrire la syntaxe correcte car je n'ai pas pu me souvenir complètement de cette fonction. Lorsque j'utilise mon propre code, je peux extraire les utilisateurs qui ont la permission comme dans le Output1. Mais je veux que les informations de pagination restent dans le tableau. Comme dans le Output2. Quelle méthode devrais-je appliquer?

Ce tableau est un exemple. J'ai juste essayé d'expliquer mon propre problème.

Mon code=>(Laravel 5.8)

$response = ….get(url)………

$list = $response->getBody()[‘content’];

$collection = collect($list);

$filtered = $collection->filter(function ($item) [
    return auth()->user->permission($item['id'])
]);

Return [‘content’ => $filtered];

Réponse brute:

[
  "paginate"=> 
  [
      "page"=> 5,
      "per_page"=> 20,
      "page_count"=> 20,
      "total_count"=> 521,
      "Links"=> [
        ["self"=> "/products?page=5&per_page=20"],
        ["first"=> "/products?page=0&per_page=20"],
      ]
  ],
  "content"=> [
    [
      "id"=> 1,
      "name"=> "Widget #1",
    ],
    [
      "id"=> 2,
      "name"=> "Widget #2",
    ],
    [
      "id"=> 3,
      "name"=> "Widget #3",
    ]
  ]
]

Output1:

[
  "content"=> 
  [
      "id"=> 1,
      "name"=> "Widget #1",
    ],
   ----------------------> Utilisateurs autorisés (id= 1, 3) ici, mais pas de pagination.
[
      "id"=> 3,
      "name"=> "Widget #3",
    ]
  ]

sortie attendue:

[
  "paginate"=> 
  [
      "page"=> 5,
      "per_page"=> 20,
      "page_count"=> 20,
      "total_count"=> 521,
      "Links"=> [
        ["self"=> "/products?page=5&per_page=20"],
        ["first"=> "/products?page=0&per_page=20"],
      ]
  ],
  "content"=> [
    [
      "id"=> 1,
      "name"=> "Widget #1",
      "uri"=> "/products/1"
    ],
    [
      "id"=> 3,
      "name"=> "Widget #3",
      "uri"=> "/products/3"
    ]
  ]
]

2voto

Ashley Points 879

Donc, si ce que vous dites est correct, il semble que vous filtriez déjà correctement votre content pour exclure ceux avec les id non désirés. Bon travail! Maintenant, vous voulez récupérer le JSON avec vos données de pagination. Tout d'abord, parcourons votre code pour voir comment nous en sommes arrivés là :

$response = ….get(url)………

$list = $response->getBody()[‘content’];

Ici, dans les deux premières lignes, nous voyons que vous avez sélectionné SEULEMENT le content de votre corps de réponse et l'avez stocké dans $list.

$collection = collect($list);

$filtered = $collection->filter(function ($item) [
    return auth()->user->permission($item['id'])
]);

Maintenant, vous prenez ce content et vous le filtrez en fonction de id.

Return [‘content’ => $filtered];

Enfin, vous retournez le content filtré. Donc, rien n'a été supprimé du tout - vous avez simplement extrait le content, l'avez filtré, et l'avez retourné. Vos données de pagination sont toujours là où vous les avez laissées. Pour obtenir le JSON que vous voulez retourner, vous pourriez ajuster la façon dont vous extrayez le content et le filtrez, mais comme je ne connais pas beaucoup de détails sur ce que vous faites ou pourquoi et que votre filtre fonctionne déjà, mon instinct est à quoi bon ? Vous pourriez simplement prendre vos données de pagination et les combiner avec votre content filtré et alors vous auriez exactement ce que vous cherchez :

$response = ….get(url)………

$list = $response->getBody()[‘content’];
$pagination = $response->getBody()[‘pagination’];

$collection = collect($list);

$filtered = $collection->filter(function ($item) [
    return auth()->user->permission($item['id'])
]);

$alldata = // combinez vos objets de pagination et filtrés

Return [‘data’ => $alldata];

Remarquez que je n'ai pas montré comment combiner la pagination et le content filtré - c'est parce que je ne suis pas sûr du type d'objets que vous avez à ce stade. Comme votre sortie d'exemple n'est pas vraiment un JSON correct, je ne suis pas sûr si la pagination est censée être une liste/tableau ou si c'est juste la façon dont vous avez écrit vos exemples, je ne suis pas sûr si ce sont des chaînes de caractères ou si elles ont été analysées, etc. Les chaînes de caractères nécessiteraient d'être concaténées, les collections utiliseraient combine(), etc.

2voto

Dlk Points 2282

Votre tableau est un tableau invalide! Je n'ai donc pas pu l'essayer, comme je l'ai mentionné dans le commentaire!

Ce que je comprends en lisant toutes vos modifications, voici quelques exemples de comment vous pouvez supprimer l'identifiant 2 du tableau en php:

Avant de commencer : nous avons la possibilité d'ignorer l'identifiant 2 dans une clause where en php comme ceci

SELECT * FROM table WHERE id NOT IN (2)

OU 

SELECT FROM table WHERE id <> 2 

Vous pouvez ignorer l'identifiant 2 lors de la requête, puis vous aurez un tableau sans l'identifiant 2, continuons avec les tableaux

si vous voulez supprimer une valeur spécifique dans un tableau, faites ce qui suit.

Supprimer d'un tableau associatif

   $YourArray = array("id"=>"2","name"=>"unNom");

    //utilisez array_key_exist pour savoir si l'identifiant existe

    $test = array_key_exists("id",$YourArray);
      if($test == 2){
        unset($YourArray['id']); //Ici vous supprimez l'identifiant 2
      }
    print_r($YourArray); //résultat du nouveau tableau

Deuxième solution avec des tableaux multidimensionnels:

// Programme PHP pour créer un tableau associatif à deux dimensions
$data = array( 

    // Ankit agira en tant que clé 
    "paginer" => array( 

        // Sujet et marque sont 
        // la paire clé-valeur 
        "id" => 1, 
        "name" => "Widget #1",  
        "uri"=> "/produits/1"
    ), 

    // Ram agira en tant que clé 
    "contenu" => array( 

        // Sujet et marque sont 
        // la paire clé-valeur 
        "id" => 2, 
        "name" => "Widget #1",  
        "uri"=> "/produits/1"
    ),  
); 

echo "Afficher les marques: \n"; 

foreach ($data as $key => $subArr) {
    if($subArr['id'] == 2){
    unset($subArr['id']);
    $data[$key] = $subArr; 
    }
}
print_r($data); 

Voici la démo : https://3v4l.org/mvZPN

Si vous voulez supprimer l'identifiant et tous ses éléments dans le tableau : array_filter(); utilisé

$test = array_filter($data, function($data) { return $data['id'] != 2; });

print_r($test);

Voici la démo : https://3v4l.org/UgNqu

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X