问题描述 投票:0回答:3

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, ), )

demo

php arrays multidimensional-array duplicates unique
3个回答
1
投票
$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

0
投票

eDit

如果您想保留第一个匹配的单对,则可以检查化合物键,如果它已经存在,则可以继续循环而无需覆盖现有的键。

-
输出

$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


0
投票

或直接突变输入阵列。 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));
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.