here是一种由中间阵列形成由排序值形成的方法。 然后,您可以搜索以找到重复的对删除。
<?php
$venues = array(
array(
'venue1' => 1,
'venue2' => 2,
),
array(
'venue1' => 3,
'venue2' => 4,
),
array (
'venue1' => 2,
'venue2' => 1,
),
array(
'venue1' => 5,
'venue2' => 6,
),
);
$result = $pairs = $venues;
array_walk($pairs, static fn(array &$value) => sort($value));
var_export($pairs);
foreach ($pairs as $k => $pair)
{
if (count(array_keys($pairs, $pair)) > 1)
{
unset($result[$k]);
}
}
var_export($result);
输出:
array (
0 =>
array (
0 => 1,
1 => 2,
),
1 =>
array (
0 => 3,
1 => 4,
),
2 =>
array (
0 => 1,
1 => 2,
),
3 =>
array (
0 => 5,
1 => 6,
),
)array (
1 =>
array (
'venue1' => 3,
'venue2' => 4,
),
3 =>
array (
'venue1' => 5,
'venue2' => 6,
),
)
$tmp = $venues;
array_walk($tmp, static fn (array &$value) => sort($value));
$tmp = array_unique($tmp, SORT_REGULAR);
$result = array_intersect_key($venues, $tmp);
var_export($result);
输出:
array (
0 =>
array (
'venue1' => 1,
'venue2' => 2,
),
1 =>
array (
'venue1' => 3,
'venue2' => 4,
),
3 =>
array (
'venue1' => 5,
'venue2' => 6,
),
)
demo
您也可能首先循环数组,创建基于有序键的化合物键。 然后您可以过滤结果,仅保留数组为2的位置,因为没有重复,因为没有重复。
例如$result = [];
$compare_arr = [
["venue1" => 1, "venue2" => 2],
["venue1" => 3, "venue2" => 4],
["venue1" => 2, "venue2" => 1],
["venue1" => 5, "venue2" => 6],
];
foreach ($compare_arr as $v1) {
sort($v1);
$cKey = $v1[0] .'-'. $v1[1];
if (array_key_exists($cKey, $result)) {
$result[$cKey][] = $v1;
continue;
}
$result[$cKey] = $v1;
}
$result = array_filter($result, function($item) {
return count($item) === 2;
});
print_r($result);
输出
Array
(
[3-4] => Array
(
[0] => 3
[1] => 4
)
[5-6] => Array
(
[0] => 5
[1] => 6
)
)
您可以看到复合键是介于两者之间的值。如果要将键从0编号,则可以使用array_values
.。
PHPDEMO如果您想保留第一个匹配的单对,则可以检查化合物键,如果它已经存在,则可以继续循环而无需覆盖现有的键。
-
输出
$result = [];
$compare_arr = [
["venue1" => 1, "venue2" => 2],
["venue1" => 3, "venue2" => 4],
["venue1" => 2, "venue2" => 1],
["venue1" => 5, "venue2" => 6]
];
foreach ($compare_arr as $v1) {
sort($v1);
$cKey = $v1[0] .'-'. $v1[1];
if (array_key_exists($cKey, $result)) {
continue;
}
$result[$cKey] = $v1;
}
print_r($result);
PHPDEMO
无论您使用经典的循环或功能迭代,都没有理由多次迭代输入阵列。 this片段看起来几乎与Fourthbird的答案相同,但我不喜欢不必要的Array
(
[1-2] => Array
(
[0] => 1
[1] => 2
)
[3-4] => Array
(
[0] => 3
[1] => 4
)
[5-6] => Array
(
[0] => 5
[1] => 6
)
)
使用。该片段将确保结果阵列中的行没有100%共享场地值(按任何顺序)。子阵列键也不会重新排序;换句话说,第一个元素键将是foreach()
continue
。 使用venue1
venue2
输出:
implode()
代码:(demo)
或直接突变输入阵列。 demo
array (
0 =>
array (
'venue1' => 1,
'venue2' => 2,
),
1 =>
array (
'venue1' => 3,
'venue2' => 4,
),
2 =>
array (
'venue1' => 5,
'venue2' => 6,
),
)
输出:
$result = [];
foreach ($data as $index => $row) {
sort($row);
$key = implode('-', $row);
if (!isset($found[$key])) {
$found[$key] = true;
$result[$key] = $data[$index];
} else {
unset($result[$key]);
}
}
var_export(array_values($result));