PHP - 按键合并2D数组

时间:2013-07-18 08:02:20

标签: php multidimensional-array array-merge

如何将这些数组合并在一起?

 Array
    (
        [0] => Array
            (
                [type] => Person
                [relevance] => 0.700000
                [count] => 300
                [text] => Chris
            )
    )
  Array
    (
        [0] => Array
            (
                [type] => Person
                [relevance] => 0.900000
                [count] => 400
                [text] => Chris
            )

        [1] => Array
            (
                [type] => Person
                [relevance] => 0.500000
                [count] => 200
                [text] => Tom
            )
    )

或像这样的数组:

Array
        (
            [0] => Array
                (
                    [type] => Person
                    [relevance] => 0.700000
                    [count] => 300
                    [text] => Chris
                )


            [1] => Array
                (
                    [type] => Person
                    [relevance] => 0.900000
                    [count] => 400
                    [text] => Chris
                )

            [2] => Array
                (
                    [type] => Person
                    [relevance] => 0.500000
                    [count] => 200
                    [text] => Tom
                )
        )

预期结果是:

Array
(
    [0] => Array
        (
            [type] => Person
            [relevance] => 0.800000
            [count] => 700
            [text] => Chris
        )



    [1] => Array
        (
            [type] => Person
            [relevance] => 0.500000
            [count] => 200
            [text] => Tom
        )
)

[相关性]值是平均数

[count]值是增量数

这些数组的合并应基于[text]值。  我怎样才能以快速的方式使用php?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

这样的事情可能是:

$newArray = array();

foreach ($oldArray as $item) {
    if (!array_key_exists($item['text'], $newArray)) {
        $newArray[$item['text']] = $item;
        $newArray[$item['relevance_values']] = array();

    } else {
        $newArray[$item['text']]['count'] += $item['count'];
        $newArray[$item['relevance_values']][] = $item['relevance'];
    }
}

foreach ($newArray as $item) {
    $relevance = 0;
    foreach ($item['relevance_values'] as $value) {
       $relevance += $value;
    }
    $item['relevance'] = $relevance / count($item['relevance_values']);
}

答案 1 :(得分:2)

如果这是数组

$array = Array(
    Array(
        'type' => 'Person',
        'relevance' => .7,
        'count' => 300,
        'text' => 'Chris'
    ),
    Array(
        'type' => 'Person',
        'relevance' => .9,
        'count' => 400,
        'text' => 'Chris'
    ),
    Array(
        'type' => 'Person',
        'relevance' => .5,
        'count' => 200,
        'text' => 'Tom'
    ),
);

然后:

$tmp = Array();

foreach($array as $obj) {
    if(!isset($tmp[$obj['text']])) {
        $tmp[$obj['text']] = array_merge(Array('total_count'=>1),$obj);
        continue;
    }
    $tmp[$obj['text']]['count']     += $obj['count'];
    $tmp[$obj['text']]['relevance'] += $obj['relevance'];
    $tmp[$obj['text']]['total_count']++; // useful for average calculation
}

$result = Array();

foreach($tmp as $key=>$obj) {
    $obj['relevance'] = $obj['relevance']/$obj['total_count'];
    unset($obj['total_count']); // useless now
    $result[] = $obj;
}

print_r($result);

答案 2 :(得分:1)

试试这个:

function mergeOnText($array){
    $results = array();
    foreach($array as $person){
        $found = -1;
        foreach($results as $i => $res)
            if($res['text'] == $person['text']){
                $found = $i;
                break;
            }
        if($found > -1){
            $results[$found]['relevance'][] = $person['relevance'];
            $results[$found]['count'] += $person['count'];
        } else {
            $results[] = $person;
        }
    }
    foreach($results as $i => $res)
        $results[$i]['relevance'] = array_sum($res['relevance']) / count($res['relevance']);
    return $results;
}