2012-09-28 2 views
1

J'ai un tableau multidimensionnel d'objets:supprimer les clés en double d'un tableau multidimensionnel

0 => 
    array 
     32281 => object ... 
     105145 => object ... 
     165656 => object ... 
     194124 => object ... 
     195397 => object ... 
     205859 => object ... 
    1 => 
    array 
     32281 => object ... 
     91504 => object ... 
     165656 => object ... 
     194124 => object ... 
     195397 => object ... 
     205859 => object ... 
    3 => 
    array 
     32281 => object ... 
     105145 => object ... 
     165656 => object ... 
     194124 => object ... 
     195397 => object ... 
     205859 => object ... 

et je veux supprimer des tableaux en double de ce tableau comme celui-ci (dans ce cas, je vais enlever 1 et juste 0 et 3 parce que 0 et 1 sont les mêmes):

 0 => 
     array 
      32281 => object ... 
      105145 => object ... 
      165656 => object ... 
      194124 => object ... 
      195397 => object ... 
      205859 => object ... 
     3 => 
     array 
      32281 => object ... 
      91504 => object ... 
      165656 => object ... 
      194124 => object ... 
      195397 => object ... 
      205859 => object ... 

J'ai essayé, sans succès, beaucoup de choses avec array_unique, array_keys, array_keys_exists ...

par exemple:

$array = array_map("unserialize", array_unique(array_map("serialize", $array))); 

ou

$result = array();  
foreach ($array as $key => $value) { 
    if(!array_key_exists($key,$result)) 
     $result[$key] = $array[$key]; 
    } 
+1

attendre que vous avez encore des doublons dans tableau 1. Question: comment obtenez-vous ce tableau? Peut-être que vous pouvez le créer sans doublons, au lieu de le boucler plus tard pour rechercher des doublons. –

Répondre

3

Cette fonction doit faire:

function my_unique($array) { 
    foreach($array as $key => $value) { 
    foreach($array as $key2 => $value2) { 
     if($key != $key2 && $value === $value2) { 
     unset($array[$key]); 
     } 
    } 
    } 
    return $array; 
} 
+0

merci beaucoup, cela fonctionne bien !! – user1705785

+0

bon tour fait – Deep

0

Vous pouvez essayer

$array = array(
    0 => 
    array (
     32281 => new stdClass , 
     105145 => new stdClass , 
     165656 => new stdClass , 
     194124 => new stdClass , 
     195397 => new stdClass , 
     205859 => new stdClass), 
    1 => 
    array (
     32281 => new stdClass , 
     91504 => new stdClass , 
     165656 => new stdClass , 
     194124 => new stdClass , 
     195397 => new stdClass , 
     205859 => new stdClass) , 
    3 => 
    array (
     32281 => new stdClass , 
     105145 => new stdClass , 
     165656 => new stdClass , 
     194124 => new stdClass , 
     195397 => new stdClass , 
     205859 => new stdClass ) 
    ); 


$array2 = array_unique(array_map("serialize", $array)); 
$final = array_map("unserialize",array_diff($array2, array_diff_assoc(array_map("serialize", $array), $array2))); 
var_dump($final); 

Sortie

array 
    1 => 
    array 
     32281 => 
     object(stdClass)[19] 
     91504 => 
     object(stdClass)[20] 
     165656 => 
     object(stdClass)[21] 
     194124 => 
     object(stdClass)[22] 
     195397 => 
     object(stdClass)[23] 
     205859 => 
     object(stdClass)[24] 
+1

LOL, Vous utilisez aussi stdClass. –

+0

Voir ma solution, array_walk_recursive fonctionne mieux. –

+0

thx, mais je don'h le dernier tableau '3 => array ( 32281 => new StdClass, 105145 => new StdClass, 165656 => new StdClass, 194124 => new StdClass, 195397 => new stdClass, 205859 => new stdClass)); ' – user1705785

0
<?php 
$arr = array (0 => 
    array(
     32281 => new stdClass, 
     105145 => new stdClass, 
     165656 => new stdClass, 
     194124 => new stdClass, 
     195397 => new stdClass, 
     205859 => new stdClass, 
    ), 
    1 => 
    array(
     32281 => new stdClass, 
     91504 => new stdClass, 
     165656 => new stdClass, 
     194124 => new stdClass, 
     195397 => new stdClass, 
     205859 => new stdClass, 
    ), 
    3 => 
    array(
     32281 => new stdClass, 
     105145 => new stdClass, 
     165656 => new stdClass, 
     194124 => new stdClass, 
     195397 => new stdClass, 
     205859 => new stdClass, 
    ), 
); 

$result = array(); 
function put($value, $key) { 
    global $result; 
    $result[$key] = $value; 
} 
array_walk_recursive($arr, "put"); 

var_dump($result); 

/** 
array(7) { 
    [32281]=> 
    object(stdClass)#13 (0) { 
    } 
    [105145]=> 
    object(stdClass)#14 (0) { 
    } 
    [165656]=> 
    object(stdClass)#15 (0) { 
    } 
    [194124]=> 
    object(stdClass)#16 (0) { 
    } 
    [195397]=> 
    object(stdClass)#17 (0) { 
    } 
    [205859]=> 
    object(stdClass)#18 (0) { 
    } 
    [91504]=> 
    object(stdClass)#8 (0) { 
    } 
} 

*/ 
+0

merci, mais je reçois un tableau vide avec cette solution – user1705785

+0

@ user1705785 Etes-vous sûr? Mon test est correct. –

+0

oui, la sortie est: ** tableau ** 'vide' – user1705785

0

Si je vous comprends question, vous voulez de-double des bases sous-réseaux sur toutes les clés.

En supposant que vous avez une clé de tableau à base 0 naturel sur la base:

$keys=array_map("serialize",array_map("array_keys",$arr)); 
$keys=array_unique($keys); 
$result=array(); 
foreach($keys as $idx=>$not_care) 
{ 
    $result[$idx]=$arr[$idx]; 
} 

Donc, pour

$arr=array(array(1234=>"1234",5678=>"5678"), 
    array(1357=>"1357",2468=>"2468"), 
    array(1234=>"1234",5678=>"5678"), 
    array(1357=>"1357",8642=>"8642")); 

vous obtenez:

Array 
(
    [0] => Array 
     (
      [1234] => 1234 
      [5678] => 5678 
     ) 

    [1] => Array 
     (
      [1357] => 1357 
      [2468] => 2468 
     ) 

    [3] => Array 
     (
      [1357] => 1357 
      [8642] => 8642 
     ) 

) 
+0

cela ne fonctionne pas parce que j'ai un tableau d'objet: donc '$ arr = array (array (1234 =>" 1234 ", 5678 =>" 5678 ")' dans mon cas est: '$ arr = array (array = 1234 => object (v => 1, id => 1234, ...), 5678 => object (v => 2, id => 5678) ' – user1705785

+0

@ user1705785 Je ne peux pas voir dans votre Par exemple, la valeur des éléments du sous-tableau est considérée, donc je ne le considère pas, en fait, que ce soit un objet ou une chaîne simple n'est pas pertinent - vous pouvez voir que mon code ne prend que _keys_ des sous-tableaux en compte, comme ce que j'ai indiqué dans ma réponse. – Passerby

Questions connexes