Вернуться




PHP - сбросить свойства объектов в массиве после вызова array_filter



У меня есть массив клиентов (объектов) и еще один массив счетов (также объектов): 

class Client {

    public $id;

    public $name;

}

 

class Invoice {

    public $id;

    public $clientId;

    public $amount;

 

Я хочу создать вложенный массив счетов для каждого клиента, без свойства $clientId.

Я попробовал следующее:

foreach ($clientesArr as &$client) {

    $client->invoices = array_filter($invoicesArr, function ($invoice) use ($client){

        return $invoice->clientId === $client->id;

    });

    foreach ($client->invoices as &$invoice) {

        unset($tec->clientId);

    }

 


Этот код вызывает следующую ошибку:

Undefined property: stdClass::$id_clientes

 

Почему это происходит?

Ответ 1

Массивы присваиваются по копии, а объекты - по ссылке. Когда вы используете array_filter, вы создаете новый массив, но поскольку элементы массива являются объектами, они копируются по ссылке.

Для вашей проблемы есть несколько решений:

Используйте array_map вместо цикла foreach:

Вместо того чтобы перебирать элементы массива и изменять их, вы можете создавать новые элементы. 

$client->invoices = array_map(function ($el) {

    $newEl = clone($el);

    unset($newEl->clientId);

    return $newEl;

}, $client->invoices);

 

Добавьте условие внутри обратного вызова array_filter:

$client->invoices = array_filter($invoicesArr, function ($invoice) use ($client) {

    return isset($invoice->clientId) && $invoice->clientId === $client->id;

});

 

Обратите внимание, что вы присваиваете свойство invoices, которое не объявлено в вашем классе Client. Хотя это и работает, лучше иметь его в определении класса.

 



Если вам понравилась эта статья поделитесь ею с друзьями, тем самым вы помогаете нам развиваться и добавлять всё больше интересного и полезного контента!




Cхожие статьи





Какой хостинг выбрать для сайта

Какой хостинг выбрать для сайта

Для беспроблемного функционирования сайта на просторах интернета необходимо ...

15 Февраля 2021    Web

Как и на чём лучше писать сайты?

Как и на чём лучше писать сайты?

Каждый начинающий сайтостроитель мечтает создать свой уникальный сайт на ко ...

21 Февраля 2021    Web

Ищем качественный и недорогой хостинг? Тогда вам сюда

Ищем качественный и недорогой хостинг? Тогда вам сюда

Рано или поздно всем вебмастерам приходится искать хостинг для своего проек ...

21 Февраля 2021    Web