2014-11-04 3 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; 
     } 
    } 

이 경우 모든 요소가 포함 된 모든 중복이 제거됩니다.

이것은 db 쿼리 바로 다음에 오는 배열입니다.

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

+0

간단한 array_unique가 작동하지 않습니다. 감사합니다. 어쨌든. – Yasitha

+0

아직 도움을 얻을 수 없습니까? – Yasitha

답변

1

이게 원하는가요? str_repeat 죄송

<?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); 
?> 

, 내가 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

+1

@ 야시 타 오케이. print_r() 출력의 예제를 제공 할 수 있겠습니까? 키로 원하는 것이 무엇인지 확실하지 않습니다. – Goombi

+0

이것이 내가 생각하는 것입니다.하지만 여전히 나는 그것을 보여줄 수 없었습니다.이 질문에 대한 답변은 Husnis의 대답과 동일합니다. – Yasitha

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; 
} 

화면은 다음과 같습니다. 언급 한 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

예 괜찮아요.하지만 원하는대로 표시 할 수 없었습니다. (이 질문을 아주 빈틈없이 보여 주었기 때문에) 어떤 생각이 들었습니까? – Yasitha

+1

@Yasitha : 배열 a를 표시해야 했습니까? 당신이 위에서 언급 한 형식으로? – Husni

+0

예. 이 배열을 사용하여 메뉴를 만들려고합니다. – Yasitha

관련 문제