添加元素对象属性匹配的数组元素

时间:2016-04-05 14:42:31

标签: php arrays

我有两个数组,第一个数组:

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,但我认为我不能用它来搜索两个对象属性....

2 个答案:

答案 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]键的元素,我们可以添加它。