合并具有相同值的数组

时间:2016-03-07 12:58:08

标签: php arrays sorting

我有这样的数组

$arr=[["a","b"],["b","c"],["d","e"],["f","c"]];

如果子数组共享相同的值,则应将它们合并为一个数组

预期产出:

$arr=[["a","b","c","f"],["d","e"]];

我试图避免在foreach中做foreach来解决这个问题。

3 个答案:

答案 0 :(得分:1)

看来你的内部数组总是有2个项目。所以嵌套循环不是必需的。这是我最初在JS中编写的解决方案,但它应该在PHP中运行良好且最有效

$arr=[["a","b"],["b","c"],["d","e"],["f","c"],["h","e"]];
$output = [];
$outputKeys = [];
$counter = 0;
foreach($arr as $V) {
    if(!isset($outputKeys[$V[0]]) && !isset($outputKeys[$V[1]])) {
        $output[$counter] = [$V[0], $V[1]];
        $outputKeys[$V[0]] = &$output[$counter];
        $outputKeys[$V[1]] = &$output[$counter];
        $counter++;
    }
    elseif(isset($outputKeys[$V[0]]) && !isset($outputKeys[$V[1]])) {
        array_push($outputKeys[$V[0]], $V[1]);
        $outputKeys[$V[1]] = &$outputKeys[$V[0]];
    }
    elseif(!isset($outputKeys[$V[0]]) && isset($outputKeys[$V[1]])) {
        array_push($outputKeys[$V[1]], $V[0]);
        $outputKeys[$V[0]] = &$outputKeys[$V[1]];
    }
}
var_dump($output); // [["a","b","c","f"],["d","e","h"]]

DEMO (click the execute button)

指针是你的朋友。使用它们:)

答案 1 :(得分:0)

这是我现在得到的解决方案。

    $arr=[["a","b","c","f"],["d","e"]];
    $sortedArray = sortFunction($arr,0,array());

function sortFunction($old,$index,$new) {
    if ($index == sizeof($old)) return $new;

    for ($i = 0; $i<sizeof($new); $i++) {
        if (count(array_intersect($new[$i],$old[$index]))) {
            $new[$i] = array_unique(array_merge($old[$index],$new[$i]), SORT_REGULAR);
            return sortFunction($old,$index + 1,$new);
        }
    }

    $new[] = $old[$index];
    return sortFunction($old,$index + 1,$new);
}

答案 2 :(得分:0)

以下算法应该做你想要的。它只是检查每个项目并检查它是否已经存在于新创建的数组中,如果是,它将它添加到该项目而不是新项目:

<?php

$arr=[["a","b"],["b","c"],["d","e"],["f","c"]];

$newArr = [];

foreach ($arr as $items) {
    $newKey = null;

    foreach ($items as $item) {
        foreach ($newArr as $newItemsKey => $newItems) {
            if (in_array($item, $newItems)) {
                $newKey = $newItemsKey;

                break 2;
            }
        }
    }

    if ($newKey !== null) {
        $newArr[$newKey] = array_merge($newArr[$newKey], $items);
    } else {
        $newArr[] = $items;
    }
}

$newArr = array_map('array_unique', $newArr);

print_r($newArr);

<强>输出

Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
            [3] => c
            [4] => f
        )

    [1] => Array
        (
            [0] => d
            [1] => e
        )

)

DEMO