2014-11-04 118 views
2

我会提到我的数组波纹管。我需要从数组中删除重复键,但我也需要保留其他元素合并。我知道这不够清楚,所以我会解释。如何从多维数组中删除一些重复的元素

这是我想要的预期结果。

Main Cat Items 1 -> Categories 1 --> Sub Cat Items 1 
        Categories 1 --> Sub Cat Items 2 
        Categories 2 --> Sub Cat Items 3 
        Categories 3 --> Sub Cat Items 4 

Main Cat Items 2 -> Categories 4 --> Sub Cat Items 5 

但从查询中我得到了一些这样的事情。

Main Cat Items 1 -> Categories 1 --> Sub Cat Items 1 
Main Cat Items 1 -> Categories 1 --> Sub Cat Items 2 
Main Cat Items 1 -> Categories 2 --> Sub Cat Items 3 
Main Cat Items 1 -> Categories 3 --> Sub Cat Items 4 
Main Cat Items 2 -> Categories 4 --> Sub Cat Items 5 

我的查询无法精炼以获取结果。所以我必须通过php来完成。这是我试过的。

$input = array_map("unserialize", array_unique(array_map("serialize", $test))); 

使用这个没有改变我得到了与重复相同的数组。

$serialized = array_map('serialize', $test); 
    $unique = array_unique($serialized); 
    $tdsdsdf = array_intersect_key($test, $unique); 

这一个也是一样的。

$unique = array(); 
    foreach ($test as $key => $value) { 
     if (!array_key_exists($value['main_cat_id'], $unique)) { 
      $unique[$value['main_cat_id']] = $value; 
     } 
    } 

当试图这样做时,它将删除与所有元素的所有重复项。

这是我刚刚获得数据库查询后的数组。

Array 
(
    [0] => Array 
     (
      [main_cat_id] => 1 
      [main_cat_name] => main cat 1 
      [cat_id] => 1 
      [cat_name] => cat1 parent 1 
      [sub_cat_name] => sub 1 cat1 parent 1 
     ) 

    [1] => Array 
     (
      [main_cat_id] => 1 
      [main_cat_name] => main cat 1 
      [cat_id] => 1 
      [cat_name] => cat1 parent 1 
      [sub_cat_name] => sub 2 cat1 parent 1 
     ) 

    [2] => Array 
     (
      [main_cat_id] => 1 
      [main_cat_name] => main cat 1 
      [cat_id] => 4 
      [cat_name] => cat2 parent 1 
      [sub_cat_name] => sub 3 cat 4 parent 1 
     ) 

    [3] => Array 
     (
      [main_cat_id] => 1 
      [main_cat_name] => main cat 1 
      [cat_id] => 5 
      [cat_name] => cat3 parent 1 
      [sub_cat_name] => 
     ) 

    [4] => Array 
     (
      [main_cat_id] => 2 
      [main_cat_name] => main cat 2 
      [cat_id] => 6 
      [cat_name] => cat 4 parent 2 
      [sub_cat_name] => 
     ) 

    [5] => Array 
     (
      [main_cat_id] => 2 
      [main_cat_name] => main cat 2 
      [cat_id] => 7 
      [cat_name] => cat 5 parent 2 
      [sub_cat_name] => 
     ) 

    [6] => Array 
     (
      [main_cat_id] => 3 
      [main_cat_name] => main cat 3 
      [cat_id] => 8 
      [cat_name] => cat 6 parent 3 
      [sub_cat_name] => 
     ) 

) 
+1

PHP的array_unique – Sekai 2014-11-04 09:38:14

+0

简单array_unique不起作用。 (无论如何,仍然无法解决) – Yasitha 2014-11-04 09:40:34

+0

仍然无法解决任何帮助? – Yasitha 2014-11-04 09:54:27

回答

1

这是你想要的吗?

<?php 
$arr = [ 
    ["main_cat_id" => 1, "main_cat_name" => "main cat 1", "cat_id" => 1, "cat_name" => "cat1 parent 1", "sub_cat_name" => "sub 1 cat1 parent1"], 
    ["main_cat_id" => 1, "main_cat_name" => "main cat 1", "cat_id" => 1, "cat_name" => "cat1 parent 1", "sub_cat_name" => "sub 2 cat1 parent1"], 
    ["main_cat_id" => 1, "main_cat_name" => "main cat 1", "cat_id" => 4, "cat_name" => "cat1 parent 1", "sub_cat_name" => "sub 3 cat4 parent1"], 
    ["main_cat_id" => 1, "main_cat_name" => "main cat 1", "cat_id" => 5, "cat_name" => "cat3 parent 1", "sub_cat_name" => ""], 
    ["main_cat_id" => 2, "main_cat_name" => "main cat 2", "cat_id" => 6, "cat_name" => "cat3 parent 1", "sub_cat_name" => ""], 
    ["main_cat_id" => 2, "main_cat_name" => "main cat 2", "cat_id" => 7, "cat_name" => "cat3 parent 1", "sub_cat_name" => ""], 
    ["main_cat_id" => 3, "main_cat_name" => "main cat 3", "cat_id" => 8, "cat_name" => "cat3 parent 1", "sub_cat_name" => ""], 
]; 
$unique = []; 
foreach ($arr as $key => $value) { 
    $unique[$value['main_cat_id']][] = $value; 
} 

function print_me($arr) 
{ 
    foreach ($arr as $main_cat) { 
     echo $main_cat[0]["main_cat_name"] . " -> "; 
     $len = strlen($main_cat[0]["main_cat_name"] . " -> "); 
     foreach ($main_cat as $index => $cat) { 
      echo $cat['cat_name'] . " --> " . $cat['sub_cat_name'] . "\n"; 
      if ($index != count($main_cat)-1) 
       echo str_repeat(" ", $len); 
     } 
     echo "\n"; 
    } 
} 
print_me($unique); 
?> 

很抱歉的str_repeat,我有麻烦的printf ... 输出:

main cat 1 -> cat1 parent 1 --> sub 1 cat1 parent1 
       cat1 parent 1 --> sub 2 cat1 parent1 
       cat1 parent 1 --> sub 3 cat4 parent1 
       cat3 parent 1 --> 

main cat 2 -> cat3 parent 1 --> 
       cat3 parent 1 --> 

main cat 3 -> cat3 parent 1 --> 
+0

嗯,但是不完全是,我会尽力让你知道,给我几分钟,比你非常多 – Yasitha 2014-11-04 10:06:26

+1

@Yasitha好的,如果你不能做它可以工作,你能给出一个预期的'print_r()'输出的例子吗?我不确定你想要什么作为键。 – Goombi 2014-11-04 10:20:44

+0

我认为这是我所期待的,但仍然无法显示它作为我在这个问题的开头部分提到Husnis的回答也与你的相同 – Yasitha 2014-11-04 10:25:38

0

尝试用这种:)

/** 
     * remove duplicate based on the given key 
     * @param {array 2d} 
     * @param {mixed} 
     * @return {array 2d} 
     */ 
    function removeDuplicate($array, $key) { 
     $clearArray = array(); 
     foreach($array as $a) { 
      $found_b = FALSE; 
      foreach($clearArray as $ca) { 
       if($ca[$key] == $a[$key]) { 
        $found_b = TRUE; 
        break; 
       } 
      } 
      if(!$found_b) { 
       $clearArray[] = $a; 
      } 
     } 
     return $clearArray; 
    } 
1

重建阵列:

$result = array(); 
foreach($test as $key=>$val){ 
    $result[$val['main_cat_id']][$val['cat_id']][] = $val; 
} 

显示类似于fo你提到的rmat:

echo '<pre>'; 
foreach($result as $key=>$main_cat) { 
    echo 'Main Cat Items ' . $key . ' --> '; 
    foreach($main_cat as $key2=>$cat) { 
     foreach($cat as $key3=>$sub) { 
      echo 'Categories ' . $key2 . ' --> '; 
      echo 'Sub Cat Items ' . $key3; 
      echo "\r\n      "; 
     } 
    } 
    echo "\r\n"; 
} 
echo '</pre>'; 
+0

yes这是可以的,但我无法显示,因为我想要的(正如我在这个问题的分档中所展示的)任何想法? – Yasitha 2014-11-04 10:20:49

+1

@Yasitha:你的意思是你需要显示数组a s以上面提到的格式? – Husni 2014-11-04 10:34:53

+0

是的。我正尝试用这个数组创建一个菜单。 – Yasitha 2014-11-04 10:37:17