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"
]
]
3 Réponses :
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);
@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.
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));
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);