2014-11-04 2 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

Это то, что вы хотите?

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

hmmm yeh, но не совсем. Я попробую и дам вам знать. Дайте мне несколько минут. Thats you very much. – Yasitha

+1

@ Yasitha Хорошо, если вы не можете сделать он работает, не могли бы вы привести пример ожидаемого вывода '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; 
} 

Показать как 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

+1

@Yasitha: вы имели в виду, что вам нужно отобразить массив a s в формате, который вы упомянули выше? – Husni

+0

есть. Я пытаюсь создать меню с этим массивом. – Yasitha

Смежные вопросы