Удалить данные в массиве ответов с помощью php - PullRequest
2 голосов
/ 11 февраля 2020

У меня есть массив, как в примере. С кодом, который я написал, я получаю вывод как в Output1 .

Вопрос: Я запрашиваю услугу, отличную от моего собственного приложения. Ответ является массивом и содержит информацию об идентификаторе. Существует разрешение () для контроля авторизации. Функция разрешения возвращает пользовательские привилегии как true и false. Но я не мог написать правильный синтаксис, потому что я не мог запомнить эту функцию полностью. Когда я использую свой собственный код, я могу получить пользователей, которые имеют разрешение, как в output1. Но я хочу, чтобы информация о нумерации страниц оставалась в массиве. Как в Output2. Какой метод я должен применить?

Этот массив является примером. Я просто попытался объяснить свою собственную проблему.

Мой код => (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];


Необработанный ответ:

[
  "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",
    ]
  ]
]

Вывод1:

[
  "content"=> 
  [
      "id"=> 1,
      "name"=> "Widget #1",
    ],
   ----------------------> Authorized users(id= 1, 3) here, but no pagination.
[
      "id"=> 3,
      "name"=> "Widget #3",
    ]
  ]


ожидаемый результат:

[
  "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"
    ]
  ]
]

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Ваш массив является недействительным массивом ! Так что я не смог попробовать, как я уже упоминал в комментарии!

Что я понимаю из прочтения всех ваших правок. Вот несколько примеров, как вы можете удалить id 2 из массива в php:

Перед запуском : у нас есть опция чтобы игнорировать идентификатор 2 в php, где предложение вроде так

SELECT * FROM table WHERE id NOT IN (2)

OR 

SELECT FROM table WHERE id <> 2 

Вы можете игнорировать идентификатор 2 при запросе, тогда у вас будет массив без идентификатора 2, давайте ограничимся массивами

, если вы Чтобы удалить указанное c значение в массиве, выполните следующие действия.

Удаление из ассоциативного массива

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

    //use array key exist to find if id exist

    $test = array_key_exists("id",$YourArray);
      if($test == 2){
        unset($YourArray['id']); //Here you unset id 2
      }
    print_r($YourArray); //result of new array

Второе решение с многомерными массивами :

// PHP program to creating two  
// dimensional associative array 
$data = array( 

    // Ankit will act as key 
    "paginate" => array( 

        // Subject and marks are 
        // the key value pair 
        "id" => 1, 
        "name" => "Widget #1",  
        "uri"=> "/products/1"
    ), 

    // Ram will act as key 
    "content" => array( 

        // Subject and marks are 
        // the key value pair 
        "id" => 2, 
        "name" => "Widget #1",  
        "uri"=> "/products/1"
    ),  
); 

echo "Display Marks: \n"; 


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

Вот демоверсия: https://3v4l.org/mvZPN

Если вы хотите удалить id и все его элементы в массиве : array_filter(); используется

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

print_r($test);

Вот демоверсия: https://3v4l.org/UgNqu

2 голосов
/ 11 февраля 2020

Итак, если то, что вы говорите правильно, похоже, что вы уже правильно фильтруете свои content, чтобы исключить тех, у кого есть нежелательные id с. Отличная работа! Теперь вы хотите получить обратно JSON, который также содержит ваши данные нумерации страниц. Сначала давайте пройдемся по вашему коду, чтобы увидеть, как мы оказались здесь:

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

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

Прямо здесь, в первых двух строках, мы видим, что вы выбрали ТОЛЬКО content из своего тела ответа и сохранили его в $list.

$collection = collect($list);

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

Теперь вы берете это content и фильтруете его на основе id.

Return [‘content’ => $filtered];

И, наконец, вы возвращаете отфильтрованный content. Итак, ничего не было удалено вообще - вы просто извлекли content, отфильтровали его и вернули. Ваши pagination данные все еще находятся там, где вы их оставили. Чтобы получить JSON, который вы хотите вернуть, вы можете настроить способ извлечения content и его фильтрации, но, поскольку я не знаю многих деталей о том, что вы делаете или почему, и ваш фильтр уже работая мой инстинкт зачем беспокоиться ? Вы можете просто взять свои pagination данные и объединить их с отфильтрованным content, и тогда у вас будет именно то, что вы ищете:

$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 = // combine your pagination and filtered objects 

Return [‘data’ => $alldata];

Обратите внимание, что я не показал, как объединить pagination и отфильтрованные content - это потому, что я не уверен, какой тип объектов у вас есть на данный момент. Поскольку ваш пример вывода не совсем правильный JSON Я не уверен, действительно ли pagination должен быть списком / массивом или это просто способ, которым вы написали свои примеры, я не уверен, что это строки или, если они были проанализированы, et c. Таким образом, строки будут требовать добавления одной к другой, коллекции будут использовать combine() и так далее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...