基于对象参数的聚合数组


aggregate array base on object parameter

我有一个对象数组,每个对象都有两个参数,如下所示:

 Array
 (
    [0] => stdClass Object
    (
        [title] => 'games'
        [transaction_id] => 102
    )
    [1] => stdClass Object
    (
        [title] => 'media'
        [transaction_id] => 95
    )
    [2] => stdClass Object
    (
        [title] => 'tv'
        [transaction_id] => 102
    )
    [3] => stdClass Object
    (
        [title] => 'jane'
        [transaction_id] => 42
    )
    [4] => stdClass Object
    (
        [title] => 'ads'
        [transaction_id] => 95
    )
 )   

"transaction_id"键在数组中的其他对象中有时具有相同的值(102,95)。

我想组织数组,使每个具有相同transaction_id值的对象都位于原始数组(多维)中的一个新数组下,如下所示:

Array
(
[0] => Array
 (
  [0] => games
  [1] => tv
 )
[1] => Array
  (
 [0] => jane
  )
[2] => Array
(
 [0] => ads
 [1] => media
 )
)

您可以使用它。它将数组关键字设置为transaction_id的值。

$result = [];
foreach($data as $d){
 $result[$d->transaction_id][] = $d->title;
}

print_r($result);返回,

Array
(
    [102] => Array
        (
            [0] => 'games'
            [1] => 'tv'
        )
    [95] => Array
        (
            [0] => 'media'
            [1] => 'ads'
        )
    [42] => Array
        (
            [0] => 'jane'
        )
)

如果要将数组键重置为(0,1,2)等,请添加$result = array_values($result);

您可以尝试以下操作:

$result = array();
foreach ($data as $obj) {
    if (empty($result[$obj->transaction_id])) {
        $result[$obj->transaction_id] = array($obj->title);
    } else {
        $result[$obj->transaction_id][] = $obj->title;
    }
}
$result = array_values($result);

您可以使用transaction_id作为新数组中的密钥

$new_array = array();
foreach ($oryginal_array as $row){
  if (!isset($new_array[$row['transaction_id']]))
     $new_array[$row['transaction_id']] = array();
  $new_array[$row['transaction_id']][] = $row['title'];
}

一种稍微不同的方法是通过自定义函数:

function aggragateByProperty($inputData, $propertyName) {
    $byProperty = array();
    foreach ($inputData as $object)
    {
        $objProperties = get_object_vars($object);
        foreach ($objProperties as $key => $value)
        {
            if ($key != $propertyName)
            {
                continue;
            }
            $byProperty[$value][] = $object;
        }        
    }
    return $byProperty;
} 

然后你可以称之为任何属性:

$outputData = aggragateByProperty($inputData, 'transaction_id');

样本输出:

阵列(3){[102]=>阵列(2){[0]=>对象(stdClass)#1(2){["title"]=>string(5)"游戏"["transaction_id"]=>int(102)}[1] =>对象(stdClass)#3(2){["title"]=>string(2)"电视"["transaction_id"]=>int(102)}}[95]=>阵列(2){[0]=>对象(stdClass)#2(2){["title"]=>string(5)"媒体"["transaction_id"]=>int(95)}[1] =>对象(stdClass)#5(2){["title"]=>string(3)"广告"["transaction_id"]=>int(95)}}[42]=>阵列(1){[0]=>对象(stdClass)#4(2){["title"]=>string(4)"jane"["transaction_id"]=>int(42)}}}