2015-08-08 55 views
-1

我有这个数组。在此我想跳过反向数据的值。跳过重复数组和颠倒序列的数组

$data = array(
    array(2, 1), 
    array(1, 2), 
    array(1, 2), 
    array(2, 1), 
    array(2, 3), 
    array(3, 2), 
    array(4, 5) 
); 

我想跳过值:

array(1,2) 
array(1,2) 
array(2,1) 
array(3,2) 

而且我想要的结果数组是这样的:

array(
    array(2, 1), 
    array(2, 3), 
    array(4, 5) 
); 
+0

你的意思是你想消除重复值,然后排序数组?或者你的意思是简单地从数组中删除单个值?你能否通过“跳过”来解释你的意思,以及哪些规则决定了哪些元素将被跳过? –

+0

是的,我想消除重复值以及消除数组的逆序。 – madhu

+0

即使子数组中的元素的顺序不同,他也想删除重复的子数组。基本上独特的子阵列 - 键不重要。 –

回答

2
$data = [[2,1], [1,2], [1,2], [2,1], [2,3], [3,2], [4,5]]; 

$data = array_map(
    function($value) { 
     sort($value); 
     return serialize($value); 
    }, 
    $data 
); 

$data = array_unique($data); 
$data = array_map('unserialize', $data); 
array_walk($data, 'sort'); 

var_dump($data); 

Demo

ED IT

按阿伯加斯特的评论,这可以进一步简化,省去了序列化/反序列化的步骤:

$data = [[2,1], [1,2], [1,2], [2,1], [2,3], [3,2], [4,5]]; 

array_walk($data, 'sort'); 
$data = array_unique($data, SORT_REGULAR); 

var_dump($data); 

Demo

+0

这确实对子数组排序,尽管不是100%。 –

+0

那么你总是可以跳过最后一行'array_walk($ data,'sort');'如果你不想排序子排列 –

+0

如果你使用array_unique($ data,SORT_REGULAR),你可以得到相同的结果。那么你不必使用序列化。 – arbogastes

0

试试这个:

function filterArray($data) 
{ 
     $result = array(); 
     array_push($result, $data[0]); //You can always add first item without performing any check 
     for($i=1; $i<count($data); $i++) 
     { 
      $allowAdd = true; 
      foreach($result as $res) 
      { 
       if(($res == $data[$i]) || ($res[0] = $data[$i][1] && $res[1] = $data[$i][0])) 
       { 
        $allowAdd = false; 
        break; 
       } 
      } 
      if($allowAdd) 
      array_push($result, $data[$i]); 
    } 
    return $result; 
} 

现在,当你打电话filterArray($data),这将返回你的过滤结果。