3 votes

Comment additionner les valeurs d'un tableau en fonction des clés en php ?

J'ai un tableau de php comme ceci

Array
(
    [0] => Array
        (
            [Sr_No] => 1
            [Asan_Category] => Warm-Up
            [Asan_Cat_Val] => 8
            [Asan_Sub_Category] => Ankle
            [Asan_Sub_Cat_Val] => 35
            [Asan_Name] => General Ankle Warm up
            [Asan_Name_Val] => 447
            [Prescribed_Steps] => 40
            [Prescribed_Ratio] => 00
            [Actual_Steps] => 12
            [Actual_Ratio] => 0
        )
 [1] => Array
        (
            [Sr_No] => 2
            [Asan_Category] => Warm-Up
            [Asan_Cat_Val] => 8
            [Asan_Sub_Category] => Knee
            [Asan_Sub_Cat_Val] => 111
            [Asan_Name] => General knee warm up
            [Asan_Name_Val] => 464
            [Prescribed_Steps] => 20
            [Prescribed_Ratio] => 00
            [Actual_Steps] => 14
            [Actual_Ratio] => 0
        )
[2] => Array
        (
            [Sr_No] => 1
            [Asan_Category] => Warm-Up
            [Asan_Cat_Val] => 8
            [Asan_Sub_Category] => Ankle
            [Asan_Sub_Cat_Val] => 35
            [Asan_Name] => General Ankle Warm up
            [Asan_Name_Val] => 447
            [Prescribed_Steps] => 40
            [Prescribed_Ratio] => 00
            [Actual_Steps] => 10
            [Actual_Ratio] => 0
        )
[3] => Array
        (
            [Sr_No] => 2
            [Asan_Category] => Warm-Up
            [Asan_Cat_Val] => 8
            [Asan_Sub_Category] => Knee
            [Asan_Sub_Cat_Val] => 111
            [Asan_Name] => General knee warm up
            [Asan_Name_Val] => 464
            [Prescribed_Steps] => 20
            [Prescribed_Ratio] => 00
            [Actual_Steps] => 9
            [Actual_Ratio] => 0
        )
)

The desired output I want 

Array
(
    [0] => Array
        (
            [Asan_Id] => 447
            [Asan_Category] => Warm-Up
            [Asan_Sub_Category] => Ankle
            [Asan_Name] => General Ankle Warm up
            [Prescribed_Steps] => 40
            [Prescribed_Ratio] => 00
            [Total_Steps] => 22
        )

    [1] => Array
        (
            [Asan_Id] => 464
            [Asan_Category] => Warm-Up
            [Asan_Sub_Category] => Knee
            [Asan_Name] => General knee warm up
            [Prescribed_Steps] => 20
            [Prescribed_Ratio] => 00
            [Total_Steps] => 23
        )
)

Je veux que ces données qui se répètent deviennent une seule mais leurs différentes étapes réelles deviennent des étapes totales avec leur somme. S'il vous plaît aidez-moi parce que j'ai essayé un certain code mais n'a pas réussi comme ceci

    $asan=[];
    $total_steps=0;
    foreach ($aasan_details as $key) {

        $total_steps += $key['Actual_Steps'];
        if(!in_array($key['Asan_Name_Val'],$asan))
        {
            $asan[] = $key['Asan_Name_Val'];

          $lookup[] = array("Asan_Id"=>$key['Asan_Name_Val'],
                      "Asan_Category"=>$key['Asan_Category'],
                      "Asan_Sub_Category"=>$key['Asan_Sub_Category'],
                      "Asan_Name"=>$key['Asan_Name'],
                      "Prescribed_Steps"=>$key['Prescribed_Steps'],
                      "Prescribed_Ratio"=>$key['Prescribed_Ratio'],
                      'Total_Steps'=>$total_steps);
        }

    }

Cela ne fonctionne pas, que dois-je faire, s'il vous plaît, aidez-moi.

$aasan_details est le tableau que j'ai montré ci-dessus et dans le tableau de recherche, j'obtiens des valeurs uniques mais pas leur total.

0 votes

Excusez-moi, mais le total des étapes contient la somme par identifiant

0 votes

Pouvez-vous fournir un var_export sortie des données fictives ?

0 votes

Asan Id est le nom asan val

2voto

Fool Points 119

La meilleure solution serait de déplacer ces données dans une base de données et d'utiliser une requête pour effectuer cette opération exacte pour vous.

Mais si vous devez le faire en code, vous pouvez utiliser un tableau à clés pour les regrouper en fonction du nombre de champs qui doivent correspondre pour qu'ils soient joints :

par exemple

foreach ..
$consolidated[$item['Asan_Cat_Val']][$item['Asan_Sub_Cat_Val']][] = $item;

Puis faites quelques boucles imbriquées pour traverser tout ça et résumer le tout.

0voto

mickmackusa Points 18931

Il y a quelques techniques utiles à expliquer ici...

  1. Vous pouvez réduire la fatigue visuelle dans vos déclarations de tableaux en boucle en établissant une collection de clés que vous savez vouloir conserver (copier) dans le tableau de sortie. Cela vous évite d'avoir à taper chaque $keyName => $row[$keyName], comme ce (mais en fin de compte, faites-vous plaisir).

  2. Déclarer des clés associatives temporaires (en utilisant $id ) tout en construisant votre tableau de sortie pour permettre isset() pour faire des contrôles super rapides pour un groupe préexistant.

  3. Si un groupe n'est pas encore défini, il faut stocker les données avec les nouvelles clés en même temps que les données avec les clés originales. Aucune arithmétique n'est nécessaire. Le site + dans mon extrait ne sont pas des "opérateurs d'addition", mais des "opérateurs d'union de tableaux" - ils fusionnent les trois tableaux sans appel de fonction (autrement, les symboles array_merge() ferait la même chose).

  4. Lorsque vous avez fini d'itérer le tableau, vous pouvez choisir de réindexer le résultat (supprimer les clés associatives temporaires) en appelant array_values() . Si l'existence de ces clés temporaires ne vous dérange pas, vous pouvez omettre l'appel de fonction.

  5. Si un groupe a déjà été rencontré auparavant, il suffit de modifier l'adresse du groupe. Total_steps . Utilisez un opérateur d'addition-affectation ( += ) pour la syntaxe la plus brève.

Code : ( Demo )

$keysToKeep = array_flip(['Asan_Category', 'Asan_Sub_Category', 'Asan_Name', 'Prescribed_Steps', 'Prescribed_Ratio']);

foreach ($array as $row) {
    $id = $row['Asan_Name_Val'];
    if (!isset($result[$id])) {
        $result[$id] = ['Asan_Id' => $id] + array_intersect_key($row, $keysToKeep) + ['Total_Steps' => $row['Actual_Steps']];
    } else {
        $result[$id]['Total_Steps'] += $row['Actual_Steps'];
    }
}
var_export(array_values($result));

Sortie :

array (
  0 => 
  array (
    'Asan_Id' => '447',
    'Asan_Category' => 'Warm-Up',
    'Asan_Sub_Category' => 'Ankle',
    'Asan_Name' => 'General Ankle Warm up',
    'Prescribed_Steps' => '40',
    'Prescribed_Ratio' => '00',
    'Total_Steps' => 22,
  ),
  1 => 
  array (
    'Asan_Id' => '464',
    'Asan_Category' => 'Warm-Up',
    'Asan_Sub_Category' => 'Knee',
    'Asan_Name' => 'General knee warm up',
    'Prescribed_Steps' => '20',
    'Prescribed_Ratio' => '00',
    'Total_Steps' => 23,
  ),
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X