2 votes

Comment fusionner deux tableaux avec la valeur moyenne si la paire clé-valeur correspond dans un tableau multidimensionnel ?

J'ai un tableau.

$arr = array(
    [
        'amenity_id' => '4277',
        'amenity_name' => 'Floor 1',
        'category_id' => '380',
        'amenity_value' => '0',
        'unit_id' => '25253',
        'unit_number' => '701',
        'dom' => '50',
        'building_id' => '423'
    ],
    [
        'amenity_id' => '4330',
        'amenity_name' => 'Floor 7',
        'category_id' => '380',
        'amenity_value' => '53',
        'unit_id' => '25253',
        'unit_number' => '701',
        'dom' => '50',
        'building_id' => '423'
    ],
    [
        'amenity_id' => '4330',
        'amenity_name' => 'Floor 7',
        'category_id' => '380',
        'amenity_value' => '53',
        'unit_id' => '25253',
        'unit_number' => '701',
        'dom' => '20',
        'building_id' => '423'
    ],
    [
        'amenity_id' => '4331',
        'amenity_name' => 'Top Floor',
        'category_id' => '380',
        'amenity_value' => '32',
        'unit_id' => '25253',
        'unit_number' => '701,',
        'dom' => '50',
        'building_id' => '423'
    ],
    [
        'amenity_id' => '4331',
        'amenity_name' => 'Top Floor',
        'category_id' => '380',
        'amenity_value' => '0',
        'unit_id' => '25253',
        'unit_number' => '701',
        'dom' => '20',
        'building_id' => '423'
    ],

);

Ici, vous pouvez voir que deux équipements avec amenity_id 4330 y 4331 sont répétées. Je souhaite fusionner ces tableaux avec le même identifiant d'équipement et calculer la valeur moyenne de amenity_value y dom .

Résultat attendu :

array(
    [
        'amenity_id' => '4277',
        'amenity_name' => 'Floor 1',
        'category_id' => '380',
        'amenity_value' => '0',
        'unit_id' => '25253',
        'unit_number' => '701',
        'dom' => '50',
        'building_id' => '423'
    ],
    [
        'amenity_id' => '4330',
        'amenity_name' => 'Floor 7',
        'category_id' => '380',
        'amenity_value' => '53',//(53+53)/2
        'unit_id' => '25253',
        'unit_number' => '701',
        'dom' => '35',//(50+20)/2
        'building_id' => '423'
    ],
    [
        'amenity_id' => '4331',
        'amenity_name' => 'Top Floor',
        'category_id' => '380',
        'amenity_value' => '16', //(32+0)/2
        'unit_id' => '25253',
        'unit_number' => '701,'
        'dom' => '35',//(50+20)/2
        'building_id' => '423'
    ],

);

Note : Il peut y avoir plus de deux éléments avec le même numéro d'agrément, c'est pourquoi nous devons trouver la moyenne.

2voto

Thirumani guhan Points 236

Le code ci-dessous récupère toutes les clés d'agréments similaires et les compare à nouveau avec le tableau principal pour les fusionner en fonction de vos besoins. Je pense que c'est ce que vous recherchez.

$newValArr = $newArr = $newAmenity = [];
foreach ($arr as $key => $value) {
    if (!array_key_exists($value['amenity_id'], $newValArr)) {
        $newValArr[$value['amenity_id']] = [];
    }
    array_push( $newValArr[$value['amenity_id']], $key );
}

foreach ($newValArr as $amenityId => $arrKeys) {
    $newAmenity = $arr[$arrKeys[0]];

    if( count($arrKeys) > 1 && $newAmenity['amenity_id'] == $amenityId){
        $newAmenity['amenity_value'] = 0;
        $newAmenity['dom'] = 0;

        foreach ($arrKeys as $arrKey) {            
            $newAmenity['amenity_value'] += ($arr[$arrKey]['amenity_value'] / count($arrKeys));
            $newAmenity['dom'] += ($arr[$arrKey]['dom'] / count($arrKeys));
        }
    }

    array_push( $newArr, $newAmenity);
}

print_r( $newArr );

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