具有相同键的数组的Concat值

时间:2016-01-04 19:31:43

标签: php arrays concatenation

我想用相同的键来连接数组的值 例如:

[0] => Array
        (
            [0] => A
            [1] => XYZ,LMN
        )

[1] => Array
    (
        [0] => B
        [1] => ABC,PQR
    )
)

预期产出:

geany <file>

4 个答案:

答案 0 :(得分:1)

一个简单的解决方案使用PHP函数array_reduce()

// The input array you posted in the question
$input = array(
    array('A', 'XYZ'),
    array('B', 'ABC'),
    array('A', 'LMN'),
    array('B', 'PQR'),
);

// Reduce the array to a new array that contains the data aggregated as you need
$output = array_reduce(
    // Process each $item from $input using a callback function
    $input,
    // The callback function processes $item; the partial result is $carry
    function (array $carry, array $item) {
        // Extract the key into a variable
        $key = $item[0];
        // If the key was encountered before
        // then a partial entry already exists in $carry
        if (isset($carry[$key])) {
            // Append the desired value to the existing entry
            $carry[$key][1] .= ','.$item[1];
        } else {
            // Create a new entry in $carry (copy $item to key $key for quick retrieval)
            $carry[$key] = $item;
        }
        // Return the updated $carry
        return $carry;
    },
    // Start with an empty array (it is known as $carry in the callback function)
    array()
);

// $output contains the array you need

答案 1 :(得分:0)

试试这个:

$final = array();

foreach ($array_items as $item)
{
    $key = $item[0];
    $found_index = -1;

    for ($i=0; $i<count($final); $i++)
    {
        if ($key == $final[$i][0])
        {
            $found_index = $i;
            break;
        }
    }

    if ($found_index == -1)
    {
        $final_item = array();
        $final_item[0] = $key;
        $final_item[1] = $item[1];
        $final[] = $final_item;
    }
    else
    {
        $final[$found_index][1] .= ",".$item[1];
    }
}

我们创建一个新数组$final,并循环遍历旧数组$array_items。对于每个项目,我们会看到$final中是否已存在具有相同[0]索引的项目。如果它不存在,我们创建它并将初始字符串添加到[1]索引。如果确实存在,我们只需将字符串添加到[1]索引的末尾。

尝试一下,用$array_items替换你的数组被调用,让我知道它是否有效。

答案 2 :(得分:0)

检查我的解决方案。它应该工作正常。我希望它会对你有所帮助。

$result = $passed_keys = $extended_arr = [];
foreach ($arr as $k => $value) {
    for($i = $k + 1; $i < count($arr); $i++){
        if ( $value[0] == $arr[$i][0] ){    // compare each array with rest subsequent arrays
            $key_name = $value[0];
            if (!array_key_exists($key_name, $result)){
                $result[$key_name] = $value[1] .",". $arr[$i][1];
            } else {
                if (!in_array($i, $passed_keys[$key_name])) {
                    $result[$key_name] .= ",". $arr[$i][1];

                }
            }
            $passed_keys[$key_name][] = $i; // memorizing keys that were passed
        }
    }
}
array_walk($result, function($v, $k) use(&$extended_arr){
    $extended_arr[] = [$k, $v];
});

结果位于$extended_arr

答案 3 :(得分:0)

我的解决方案,创建一个自定义键,使识别字母更容易。这消除了连续遍历每个阵列的需要,这可能成为主要的资源困境。

<?php
$inital_array = array(
    array('A','XYZ'),
    array('B','ABC'),
    array('A','LMN'),
    array('B','PQR')
);

$concat_array = array();

foreach($inital_array as $a){
    $key = $a[0];

    if( !isset($concat_array[$key]) ){
        $concat_array[$key] = array($key,'');
    }

    $concat_array[$key][1] .= (empty($concat_array[$key][1]) ? '' : ',').$a[1];
}

$concat_array = array_values($concat_array);

echo '<pre>',print_r($concat_array),'</pre>';