数组中的相关元素

时间:2013-12-04 20:38:30

标签: php arrays sorting

我有一个以下格式的数组:

[8106] => Array (
    [id1] => 210470
    [id2] => 216298
)

[8107] => Array (
    [id1] => 210470
    [id2] => 187145
)

[8108] => Array (
    [id1] => 187145
    [id2] => 216298
)

[8109] => Array (
    [id1] => 187145
    [id2] => 210470
)

[8110] => Array (
    [id1] => 266533
    [id2] => 249612
)
[8111] => Array (
    [id1] => 249612
    [id2] => 266533
)

我需要将其改为以下格式:

[0] => Array (
    [0] => 266533
    [1] => 249612
)
[1] => Array (
    [0] => 187145
    [1] => 210470
    [2] => 216298
)

基本上,我需要提取所有ID,保持关系,但将它们组合在一起。我有一个功能来做到这一点,但它需要永远(我必须运行的行数超过30分钟)。钥匙和订单并不重要。这种关系非常重要。我正在寻找一种更快的方法。我正在使用的功能如下:

function getMatchingIDs($filteredArray)
{
    $result = array();

    $resultCount = 0;
    foreach ($filteredArray as $details) {
        $imaId1 = inMultiArray($details['id1'], $result);
        $imaId2 = inMultiArray($details['id2'], $result);

        if ($imaId1 === false && $imaId2 === false) {
            $result[$resultCount++] = array(
                $details['id1'],
                $details['id2'],
            );
        } elseif (is_numeric($imaId1) === true && $imaId2 === false) {
            $result[$imaId1][] = $details['id2'];
        } elseif ($imaId1 === false && is_numeric($imaId2) === true) {
            $result[$imaId2][] = $details['id1'];
        } elseif ($imaId2 != $imaId1) {
            $result[$imaId1] = array_merge($result[$imaId1], $result[$imaId2]);
            unset($result[$imaId2]);
        }
    }

    return $result;
}

function inMultiArray($elem, $array)
{
    if (is_array($array) === true) {
        // if the variable $elem is in the variable $array return true
        if (is_array($array) === true && in_array($elem, $array) === true) {
            return true;
        }

        // if $elem isn't in $array, then check foreach element
        foreach ($array as $key => $arrayElement) {
            // if $arrayElement is an array call the inMultiArray function to this element
            // if inMultiArray returns true, than return is in array, else check next element
            if (is_array($arrayElement) === true) {
                $value = inMultiArray($elem, $arrayElement);
                if ($value === true) {
                    return $key;
                }
            }
        }
    }

    // if isn't in array return false
    return false;
}

$filtered = getMatchingIDs($unfiltered);

编辑:原始数组描述了id对之间的关​​系(未在数组中显示)。期望的输出是进一步定义关系。如果你查看原始数组,元素8106-8109只是三个id的成对组合。我需要将这三个组合在一起。元素8110和8111是不同的对,只是顺序不同。

2 个答案:

答案 0 :(得分:0)

$newArray = array();
foreach ($array as $k => $v) {
  $newArray[0][] = $v['id1'];
  $newArray[1][] = $v['id2'];
}

答案 1 :(得分:0)

我最终做的是从本质上创建一个索引数组。该数组保存了主数组中每个值的所有位置。

以下数组

[0] => Array (
    [0] => 266533
    [1] => 249612
)
[1] => Array (
    [0] => 187145
    [1] => 210470
    [2] => 216298
)

的索引为:

[187145] => 1
[210470] => 1
[216298] => 1
[249612] => 0
[266533] => 0

因此,我不是在主多维数组中查找值,而是检查它是否存在于索引数组中并根据该数据处理数据。结果是它现在以< 5秒而不是>运行整个过程。 1小时。

感谢您的帮助。