我有一个数组的客户端(对象)和另一个数组的发票(也是对象):
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
为什么会发生呢?
正如本答案所解释的,数组是通过复制分配的,而对象是通过引用分配的。使用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;
});
顺便说一句,请注意您分配的属性invillation
在client
类中没有声明。虽然它起作用,但在您的类定义中拥有它是一个更好的实践。
我已经设法编写了一个使用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使用闭包的解决方案]的替代方法,您实际上可以在文档页面的注释中找到示例。 这个想法是您创建一个具有所需状态()和回调方法(作为参数)的对象: 用法(