PHP - 使关联数组变为唯一,键->值和值->键

4
我有一个在php中很难用言语解释的小问题。我有一个包含键值对的关联数组。我想要编写一个函数(或者如果已经有了一个函数)来接收输入的数组并删除两个方向上的重复项。
例如:
在我的数组中,我有 {a -> b} {a -> c} {b -> a} {b -> c} ...
从这个角度来看,似乎没有任何重复项,但对我而言 {a -> b} 和 {b -> a} 是重复的。因此,我希望函数将其视为重复项,并只返回其中一个。
我尝试使用array_flip / array_unique在循环中交换键和值,但并不是很成功。
你能帮忙找到一种即使是长度很长的数组也能实现这样的方法吗?或者是否有一个PHP函数可以实现?
非常感谢您的帮助!谢谢。
以下是代码以说明这个思路:
对于一个像这样的数组:
Array ( 
    [0] => Array ( [0] => a [1] => b)
    [1] => Array ( [0] => a [1] => c )
    [2] => Array ( [0] => b [1] => a )
    [3] => Array ( [0] => b [1] => c )
)

你能给一个更详细的代码示例吗? - Miloš Đakonović
所以你只想删除完全相同的一对,即 a->bb->a,而不是 a->ba->ca->bc->b - Alasdair
{a -> b} {a -> c} 是否有多个同名键(不可能)?如果我理解正确,如果键a也存在于例如b => a的值中,则对您而言它是重复的吗?如果不是,则array_diff_assoc()可能是您要查找的函数。 - kjetilh
很抱歉,我不知道Alasdair和Miloshio的情况。 - StringerB
[0] => 数组 ( [0] => a [1] => b) 这不是一个关联数组,要么你的问题有误导性,要么你的例子是错误的。我猜是前者,因为你在谈论重复的键,这是不可能的。 - Fabian Schmengler
显示剩余2条评论
2个回答

4
这将删除您的重复项。
foreach($array as $key => $value){
     if (isset($array[$key])){
        if(isset($array[$value])){
            if($array[$value] == $key){
                unset($array[$value]);
            }
        }
     }
 }

使用数组 <?php $array = array( 'a' => 'b', 'b' => 'a', 'c' => 'd', 'd' => 'c' ); ?> 时,该数组返回为空。 - kjetilh
1
它返回数组 ( [a] => b [c] => d ) - Antonio Papa
我没有提出这个问题,是@StringerB提出的,我鼓励他也标记您的答案。 - kjetilh
谢谢您的回复,说实话我不理解您的代码! - StringerB
$array 是你的数组,其中包含重复的值。如果你使用 foreach 循环,它将会移除所有的重复值。例如,如果你的数组是 $array = array( 'a' => 'b', 'b' => 'a', 'c' => 'd', 'd' => 'c' );,那么结果将是 Array ( [a] => b [c] => d )。 - Antonio Papa

2
这应该可以工作:
function cleanArray($array)
{
   $newArray = array();
   foreach ($array as $key => $val) {
      if (isset($array[$val]) && $array[$val] == $key) {
         if (!isset($newArray[$key]) && !isset($newArray[$val])) {
            $newArray[$key] = $val; 
         }      
         unset($array[$key], $array[$val]);
      }
   }    
   return array_merge($array, $newArray);
}

Working example here.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接