基于对象参数的聚合数组

时间:2013-11-25 10:45:06

标签: php

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

 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)。

我想对数组进行orginizie,以便具有相同transaction_id值的每个对象都位于原始数组(Multidimensional)中的新数组下,如下所示:

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

4 个答案:

答案 0 :(得分:2)

你可以用它。它将数组键设置为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'
        )

)

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

答案 1 :(得分:2)

您可以尝试这样的事情:

$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);

答案 2 :(得分:1)

您可以将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'];
}

答案 3 :(得分:1)

自定义函数采用略有不同的方法:

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');

示例输出:

array(3) {
    [102]=>
    array(2) {
        [0]=>
        object(stdClass)#1 (2) {
            ["title"]=>
            string(5) "games"
            ["transaction_id"]=>
            int(102)
        }
        [1]=>
        object(stdClass)#3 (2) {
            ["title"]=>
            string(2) "tv"
            ["transaction_id"]=>
            int(102)
        }
    }
    [95]=>
    array(2) {
        [0]=>
        object(stdClass)#2 (2) {
            ["title"]=>
            string(5) "media"
            ["transaction_id"]=>
            int(95)
        }
        [1]=>
        object(stdClass)#5 (2) {
            ["title"]=>
            string(3) "ads"
            ["transaction_id"]=>
            int(95)
        }
    }
    [42]=>
    array(1) {
        [0]=>
        object(stdClass)#4 (2) {
            ["title"]=>
            string(4) "jane"
            ["transaction_id"]=>
            int(42)
        }
    }
}