2
votes

Combinez deux tableaux en utilisant un champ en PHP

J'ai un tableau dans lequel je veux combiner les champs communs ensemble. Pour que les noms communs soient regroupés et qu'ils contiennent les valeurs communes de ce nom particulier. Voici mon tableau

foreach ($data as $key => $value) {
      $group[$value['name']]['name'] = $value['name'];
      $group[$value['name']][$key]['count_employee'] = $value['count_employee'];
      $group[$value['name']][$key]['count_warehouse'] = $value['count_warehouse'];
}

Je veux que la sortie soit

[
  [
    name: "Harry",
    count_employee:2
    count_warehouse:1
  ],
  [
    name: "Jack",
    count_employee: 61
    count_warehouse: 45
  ],
  [
    name: "John",
    count_employee:11
    count_warehouse:77
  ],
]

Jusqu'à présent, j'ai essayé cela

[
  [
    count_employee: 2,
    name: "Harry"
  ],
  [
    count_employee: 61,
    name: "Jack"
  ],
  [
    count_employee: 11,
    name: "John"
  ],
  [
    count_warehouse: 1,
    name: "Harry"
  ],
  [
    count_warehouse: 77,
    name: "John"
  ],
  [
    count_warehouse: 45,
    name: "Jack"
  ]
]


0 commentaires

3 Réponses :


4
votes

Faites une boucle sur le tableau et utilisez le nom comme index de chaque élément. Si aucun élément de cet index n'existe, définissez-le comme un tableau vide.

Ensuite, tout ce que vous avez à faire est d'ajouter les champs (s'ils existent) à la colonne appropriée.

Votre problème était que vous créiez un tableau avec un trop grand nombre de dimensions, au lieu d'ajouter chaque valeur au nombre actuel - en plus du fait que vous n'aurez pas toujours défini le nombre d'entrepôt et d'employés pour chaque itération.

$result = [];
foreach ($arr as $v) {
    // Initialize the person
    if (!isset($result[$v['name']])) {
        $result[$v['name']] = ["name" => $v['name'], "count_employee" => 0, "count_warehouse" => 0];
    }
    // Add values
    if (isset($v['count_employee']))
        $result[$v['name']]['count_employee'] += $v['count_employee'];
    if (isset($v['count_warehouse']))
        $result[$v['name']]['count_warehouse'] += $v['count_warehouse'];
}
// print_r($result);


1 commentaires

@HarjeevSingh - Si vous ne faites pas ce que les noms sont des clés, vous pouvez faire: $ result = array_values ​​($ result); après la boucle.



0
votes

Vous pouvez utiliser array_walk avec array_key_exists

$res=[];
array_walk($arr, function($v,$k) use (&$res){
 if(array_key_exists($v['name'], $res))
  $res[$v['name']]['count_warehouse'] = $v['count_warehouse'];
 else
  $res[$v['name']] = $v;
});
print_r(array_values($res));

Démo en direct


0 commentaires

0
votes

En supposant que tout le tableau a une clé de nom pour chaque sous-tableau contenu dans, nous pouvons utiliser le nom comme clé pour un tableau et fusionner les tableaux avec les valeurs de nom correspondantes.

array (
    'Harry' => 
    array (
      'count_warehouse' => 1,
      'name' => 'Harry',
      'count_employee' => 2,
    ),
    'Jack' => 
    array (
      'count_warehouse' => 45,
      'name' => 'Jack',
      'count_employee' => 61,
    ),
    'John' => 
    array (
      'count_warehouse' => 77,
      'name' => 'John',
      'count_employee' => 11,
    ),
  )

Résultat:

<?php
$data=
[
  [
    'count_employee'=> 2,
    'name'=> 'Harry'
  ],
  [
    'count_employee'=> 61,
    'name'=> 'Jack'
  ],
  [
    'count_employee'=> 11,
    'name'=> 'John'
  ],
  [
    'count_warehouse'=> 1,
    'name'=> 'Harry'
  ],
  [
    'count_warehouse'=> 77,
    'name'=> 'John'
  ],
  [
    'count_warehouse'=> 45,
    'name'=> 'Jack'
  ]
];

$output = [];
foreach($data as $item) {
    $output[$item['name']] = array_merge($item, $output[$item['name']] ?? []);
}


var_export($output);


0 commentaires