2009-12-23 7 views
1

J'ai "hérité" de certaines données, que j'essaye de nettoyer. Le tableau provient d'une base de données qui, apparemment, n'avait pas de clés.php - recréer un tableau?

Le tableau lui-même, est assez longue, donc je schématise les choses pour ce poste ...

[0] => Array 
     (
      [id] => 2 
      [uid] => 130 
      [eid] => 8 
      [ename] => Standard 
      [eaction] => Check 
     ) 
[1] => Array 
     (
      [id] => 2 
      [uid] => 110 
      [eid] => 8 
      [ename] => Standard 
      [eaction] => Check 
     ) 
[2] => Array 
     (
      [id] => 2 
      [uid] => 200 
      [eid] => 8 
      [ename] => Standard 
      [eaction] => Check 
     ) 

Je suis en train de changer les choses de sorte que le tableau est multidimensionnel et sont regroupées par Ename:

[0] => Array 
     (
      [Standard] => Array 
      (
       [id] => 2 
       [uid] => 130 
       [eid] => 8 
       [eaction] => Check 
      ) 
     ) 
[0] => Array 
     (
      [Standard] => Array 
      (
       [id] => 2 
       [uid] => 130 
       [eid] => 8 
       [eaction] => Check 
      ) 
     ) 
[0] => Array 
     (
      [Standard] => Array 
      (
       [id] => 2 
       [uid] => 130 
       [eid] => 8 
       [eaction] => Check 
      ) 
     ) 

Quelqu'un sait comment faire quelque chose comme ça?

+0

Pouvez-vous expliquer plus loin? Qu'est-ce que "Standard" et quand y en a-t-il d'autres? Voulez-vous savoir comment transformer votre tableau actuel dans le nouveau ou simplement créer le nouveau? – philfreo

+0

Votre deuxième exemple n'a pas vraiment de sens. Les ID sont répétés (tous les 0) et je ne décrirais pas cela comme multidimensionnel. Précisez s'il vous plaît. – cletus

Répondre

1

Vous pouvez utiliser usort() pour trier un tableau par une fonction définie par l'utilisateur. Cette fonction pourrait comparer les champs ename. Alors c'est juste une simple transformation. Comme:

usort($array, 'cmp_ename'); 

function cmp_ename($a, $b) { 
    return strcmp($a['ename'], $b['ename']); 
} 

puis:

$output = array(); 
foreach ($array as $v) { 
    $ename = $v['ename']; 
    unset($v['ename']); 
    $output[] = array($ename => $v); 
} 
1
$outputarray = array(); 

foreach($inputarray as $value) { 
    $outputarray[] = array($value['ename'] => $value); 
} 

accomplirait ce que vos exemples semblent indiquer (à part le fait que votre « résultat » par exemple a plusieurs choses toutes avec la touche 0 ... ce qui est pas valable. Je suppose que vous vouliez dire au numéro eux 0,1,2 et cetera). Cependant, je dois me demander quel avantage vous en retirerez, puisque tout ce qu'il semble faire, c'est ajouter une autre dimension qui ne sert à rien. Peut-être pourriez-vous préciser votre exemple s'il y a d'autres choses à prendre en compte?

0
$outputarray = array(); 

foreach($inputarray as &$value) { 
    $outputarray[][$value['ename']] = $value; 
    unset($value['ename']); 
} unset($value); 
0

Je devine que c'est ce que vous demandez:

function array_group_by($input, $field) { 
    $out = array(); 
    foreach ($input as $row) { 
    if (!isset($out[$row[$field]])) { 
     $out[$row[$field]] = array(); 
    } 
    $out[$row[$field]][] = $row; 
    } 
    return $out; 
} 

et utilisation:

var_dump(array_group_by($input, 'ename')); 
0

philfreo avait raison, mais il était aussi un peu. avec son code chaque fois que vous rencontrez un élément de tableau avec un ['ename'] le même que celui que vous avez déjà parcouru il va écraser les données de l'élément précédent avec le même ['ename']

vous pourriez vouloir faire quelque chose comme ceci:

$output = array(); 
foreach ($YOURARRAY as $value) { 
    $output[$value['ename']][] = $value; 
} 
var_dump($output); // to check out what you get