我有一个以下格式的数组:
[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是不同的对,只是顺序不同。
答案 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小时。
感谢您的帮助。