当前位置: 首页 > 知识库问答 >
问题:

PHP-在array_filter之后取消设置数组中对象的属性

宇文峰
2023-03-14

我有一个数组的客户端(对象)和另一个数组的发票(也是对象):

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个答案

东门文斌
2023-03-14

正如本答案所解释的,数组是通过复制分配的,而对象是通过引用分配的。使用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;
});

顺便说一句,请注意您分配的属性invillationclient类中没有声明。虽然它起作用,但在您的类定义中拥有它是一个更好的实践。

 类似资料:
  • 我已经设法编写了一个使用Java8Streams API的解决方案,该解决方案首先按对象路由的值对其列表进行分组,然后对每组中的对象数进行计数。它返回映射路由->long。代码如下: 和路由类: 应转换为: 请注意,映射的键数为2条路由,它是lastUpdated值最大的一条。

  • 问题内容: 我设法使用Java 8 Streams API编写了一个解决方案,该解决方案首先按其值对对象Route列表进行分组,然后对每个组中的对象数进行计数。它返回一个映射Route-> Long。这是代码: 和Route类: 我还想实现的是,每个组的密钥都是lastUpdated值最大的密钥。我已经在研究此解决方案,但是我不知道如何组合计数和按值分组以及路由最大lastUpdated值。这是我

  • 基本上,我正在做一个项目,其中某些类属性和类的名称存储在文本文件中。这里的目标是创建文本文件中列出的特定数据类型(在本例中为Car)的对象列表(我已经完成了),然后将这些对象分配给文本文件中的数据类型。下面是我将使用的文本文件的示例: 汽车:2辆 4 1 1红色3 80.5 20 60 2aadawd 1 3 2蓝色3 80 30 20 1aaxzd 自行车: 3 2 1 2号2号 2 3 基本上

  • 有一个名为的类。 并且我有一个对象的数组。我现在需要的是将该数组中所有对象的s提取到一个新数组中。 我也发现了这个类似的问题。但是它是在Objective-C中的,所以它使用来实现这一点。 我怎么能在斯威夫特做到这一点呢?

  • 问题内容: 我有一个数组: 如果我要转储数组的内容,它们将如下所示: 当我循环浏览并取消设置某些键时,索引将全部升起。 随后,如果我现在又进行了一次转储,它将看起来像: 有没有适当的方法来重置数组,使其元素再次基于零? 问题答案: 尝试这个: 使用array_values()

  • 问题内容: 我有以下代码: 我可以用来过滤这样的数组: 我如何在lower_than_10中添加参数,以便它也接受要检查的数字?喜欢,如果我有这个: 如何从array_filter调用它传递10到$ num或任何数字? 问题答案: 作为@Charles使用闭包的解决方案]的替代方法,您实际上可以在文档页面的注释中找到示例。 这个想法是您创建一个具有所需状态()和回调方法(作为参数)的对象: 用法(