2013-02-23 2 views
4

У меня есть небольшая проблема в php, которую мне трудно объяснить словами. У меня есть ассоциативный массив, содержащий ключ-значение. Я хотел бы сделать функцию (или если она уже есть), которая будет принимать массив в качестве входных данных и удалять дубликаты, но в обоих направлениях.PHP - Сделать ассоциативный массив уникальным, ключ -> значение и значение -> ключ

Например:

В моем массиве у меня есть {а -> Ь} {а -> с} {Ь -> а} {Ь -> с} ...

С этой точки зрения похоже, что нет дубликата, но для меня {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) 
) 
+0

Не могли бы вы привести более подробный пример кода? –

+0

Итак, вы хотите только удалить пары, которые идентичны, то есть 'a-> b' &' b-> a', но не 'a-> b' &' a-> c' или 'a-> b' & 'c-> b'? – Alasdair

+0

* {a -> b} {a -> c} * У вас есть несколько ключей с тем же именем (не возможно) ..? Если я правильно понял, если ключ * a * также существует как значение, например * b => a *, это дубликат для вас? Если нет, то [array_diff_assoc()] (http://www.php.net/manual/en/function.array-diff-assoc.php), вероятно, является функцией, которую вы ищете. – kjetilh

ответ

4

Это приведет к удалению дубликатов

foreach($array as $key => $value){ 
    if (isset($array[$key])){ 
     if(isset($array[$value])){ 
      if($array[$value] == $key){ 
       unset($array[$value]); 
      } 
     } 
    } 
} 
+0

с массива ' 'B', \t 'б' => 'а', \t 'с' => 'd', \t 'd' => 'c' ); ?> 'массив возвращает пустой – kjetilh

+0

вы пробовали? –

+0

У вас есть? ** Я ** не написал код :) – kjetilh

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.

+0

, чтобы попробовать это. благодаря – StringerB