我有两个数组,第一个数组:
array (size=3)
0 =>
object(stdClass)[31]
public 'PkID' => string '489' (length=3)
public 'HouseFk' => string '22' (length=2)
public 'ConstructionTypeFk' => string '1' (length=1)
public 'Price' => string '666' (length=3)
public 'discount_id' => string '1' (length=1)
第二阵列:
array (size=2)
0 =>
object(stdClass)[28]
public 'PkID' => string '22' (length=2)
public 'ArchitectFk' => string '13' (length=2)
public 'ShortVersion' => string '169' (length=3)
public 'Subtitle' => string '' (length=0)
public 'Size' => string '170.29' (length=6)
public 'ConstructionTypeFk' => string '1'
两个阵列比上面的长得多。
现在我想要运行第二个数组并在此属性中创建NEW属性public 'discounts'
将是包含所有匹配的第一个数组元素的数组。
换句话说,对于第二个数组的每个元素,我想检查第一个数组中的HouseFk
与当前元素的PkID
的相同位置以及ConstructionTypeFk
的位置与当前元素相同,并在当前元素中添加这些匹配。
以下内容:
foreach ($second_array as $value)
{
$value->discounts[] = first array element where HouseFk is equal to $value->PkID and ConstructionTypeFk is equal to $value->ConstructionTypeFk;
}
我可以构建伪代码并知道该怎么做,我只是不知道该用什么。我试过阅读array_filter
,但我认为我不能用它来搜索两个对象属性....
答案 0 :(得分:1)
就像上面的评论中已经说过的那样,您可以安全地使用 array_filter 来实现此目的,因为在其中,您可以定义一个回调,它可以根据您的需要处理条件,而不是无论你想要检查的数组值有多深或有多少值,你需要做的就是在最后为你要保留的元素返回true。
foreach ($second_array as &$secondValue) {
$secondValue->discounts[] = array_filter(
$first_array,
function ($firstValue) use ($secondValue) {
return $firstValue->HouseFk === $secondValue->PkID
&& $firstValue->ConstructionTypeFk === $secondValue->ConstructionTypeFk;
}
);
}
// now just unset the reference to $secondValue
unset($secondValue);
答案 1 :(得分:0)
假设您的第一个数组是$array1
而第二个数组是$array2
:
$discounts = array();
foreach( $array1 as $row )
{
$discounts[$row->HouseFk][$row->ConstructionTypeFk][] = $row;
}
foreach( $array2 as $row )
{
if( isset($discounts[$row->PkID][$row->ConstructionTypeFk]) )
{
$row->discounts = $discounts[$row->PkID][$row->ConstructionTypeFk];
}
}
的 eval.in demo 强>
首先我们迭代 children 数组,创建一个新的数组($discounts
),其键为[HouseFk][ConstructionTypeFk]
,然后它是简单的,迭代主数组,添加相应的->discounts
属性:如果在$discounts
数组中有一个带[PkID][ConstructionTypeFk]
键的元素,我们可以添加它。