Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2020-06-19, 01:02
  #13
Medlem
z0mfg(ish)s avatar
Citat:
Ursprungligen postat av abloodywar
Hela isset kan skippas också, += kommer skapa eller addera beroende om den redan är satt eller ej.
Citat:
Ursprungligen postat av abloodywar
Kod:
@$arr1[$key] += $value
Citat:
Ursprungligen postat av abloodywar
Allt som allt skulle jag nog säga underkänt på arbetsprovet
Lol.


Citat:
Ursprungligen postat av Koenigsegg
Varför inte sätta $res till $arr1 på en gång ?
Good catch!

Missade TSs uppdatering av frågan, där en lite mer detaljerad array syns.
Men, det är ju bara loopa igenom arrayet och summera subarrayer om så önskas.
__________________
Senast redigerad av z0mfg(ish) 2020-06-19 kl. 01:15.
Citera
2020-08-05, 11:38
  #14
Medlem
Robert-Arslebergs avatar
Du kan göra något i stil med detta:

Kod:
<?php
$data 
= [
    
'en_1' => [
        
'value' => 150,
        
'value2' => 200,
    ],
    
'en_2' => [
        
'value' => 100,
        
'value2' => 300,
    ],
    
'sv_1' => [
        
'foo' => 150,
        
'bar' => 200,
    ],
    
'sv_2' => [
        
'foo' => 100,
        
'baz' => 300,
    ],
];

$output = [];

foreach (
$data as $name => $values) {
    if (!
is_array($values)) {
        continue;
    }

    
$category substr($name03);

    if (!isset(
$output[$category])) {
        
$output[$category] = [];
    }

    foreach (
$values as $key => $value) {
        if (!isset(
$output[$category][$key])) {
            
$output[$category][$key] = 0;
        }
        
$output[$category][$key] += $value;
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<pre>
<?php print_r($output?>
</pre>
</body>
</html>

Det tillåter godtyckligt namn på såväl nycklar som värden.
Citera
2020-08-22, 15:54
  #15
Medlem
Gammal tråd men eftersom folk fortsätter svara så gör jag med det.
Jag skulle nog löst det på följande sätt, endast en iteration av den yttre arrayen behövs.
Det går mer än säkert att lösa på effektivare sätt dock!
Kod:
<?php
    $input 
= [
        [
111 => ["val1" => 2"val2" => 3]],
        [
111 => ["val1" => 3"val2" => 5]],
    ];
    
$output = [111 => []];

    foreach(
$input as $k => $values) {
        (!isset(
$c)) ? $c $c++;
        
$sum array_sum(array_values($values)[0]);
        
$output[111]["val".$c] = $sum;
    }
?>
Citera
2020-08-22, 18:07
  #16
Medlem
Robert-Arslebergs avatar
Citat:
Ursprungligen postat av ath0
Gammal tråd men eftersom folk fortsätter svara så gör jag med det.
Jag skulle nog löst det på följande sätt, endast en iteration av den yttre arrayen behövs.
Det går mer än säkert att lösa på effektivare sätt dock!
Kod:
<?php
    $input 
= [
        [
111 => ["val1" => 2"val2" => 3]],
        [
111 => ["val1" => 3"val2" => 5]],
    ];
    
$output = [111 => []];

    foreach(
$input as $k => $values) {
        (!isset(
$c)) ? $c $c++;
        
$sum array_sum(array_values($values)[0]);
        
$output[111]["val".$c] = $sum;
    }
?>

Den summerar inte korrekt.

Om du byter:
Kod:
$input = [
    [
111 => ["val1" => 2"val2" => 3]],
    [
111 => ["val1" => 3"val2" => 5]],
]; 
till:
Kod:
$input = [
    [
111 => ["val1" => 2"val2" => 1]],
    [
111 => ["val1" => 3"val2" => 5]],
]; 

Så ger det output:
Kod:
Array ( [111] => Array ( [val1] => [val2] => ) ) 

Det verkar således som att den summerar varje rad för sig.
Citera
2020-08-22, 18:20
  #17
Medlem
Citat:
Ursprungligen postat av Robert-Arsleberg
Den summerar inte korrekt.
Det verkar således som att den summerar varje rad för sig.


Det var så jag uppfattade TS gällande problemställningen.
Däremot ser jag nu att även om man hade viljat summera alla nycklar genom samma array index så hade outputen blivit likadan, så det var ett ganska dåligt exempel!
Då blev det nog kanske lite klurigare, ska se om man kan hitta på nåt.

Citat:
Ursprungligen postat av kakan14
Hmm nej den gjorde inte riktigt tricket och har kollat mer på hur arrayen ser ut. Den ser ut enligt följande:

Kod:
Array(
  [0] => array(
    [111] => array(
        [val1]=>2
        [val2]=>3
    )
  )
  [1] => array(
    [111] => array(
        [val1]=>3 
        [val2]=>5
    )
  )
)

Och jag skulle vilja ha den till:
Kod:
array(
[111] => array(
    [val1]=>5
    [val2]=>8
  )
)

Dock så kan första arrayen innehålla mer än 2 subarrayer.
Citera
2020-08-22, 18:37
  #18
Medlem
Följande kod bör ge rätt resultat istället, inte testat med större arrayer men kan potentiellt bli jobbigt.
Den fungerar däremot också om man i ena arrayen lägger till t.ex "val3" => 10 också, dessutom slipper vi att skriva egna loopar!

Kod:
<?php
    $input 
= [
        [
111 => ["val1" => 1"val2" => 2]],
        [
111 => ["val1" => 3"val2" => 4]],
    ];

    
$output = [111 => []];

    
array_walk_recursive($input, function($i$k) use (&$output){
        
$output[111][$k] = isset($output[111][$k]) ?  $i $output[111][$k] : $i;
    });
    
print_r($output);
?>
Ger följande output.
Kod:
Array
(
    [111] => Array
        (
            [val1] => 4
            [val2] => 6
        )

)
Citera
2020-08-23, 10:09
  #19
Medlem
Robert-Arslebergs avatar
Citat:
Ursprungligen postat av ath0
Följande kod bör ge rätt resultat istället, inte testat med större arrayer men kan potentiellt bli jobbigt.
Den fungerar däremot också om man i ena arrayen lägger till t.ex "val3" => 10 också, dessutom slipper vi att skriva egna loopar!

Bra! array_walk_recursive tänkte jag inte på.

Möjligtvis skulle scriptet gå att göra lite mer läsbart enligt nedan, men bara min åsikt.

Kod:
<?php
    $input 
= [
        [
111 => ["val1" => 1"val2" => 2]],
        [
111 => ["val1" => 3"val2" => 4]],
    ];

    
$output = [];

    
$sumValues = function($item$key) use (&$output) {
        
$output[$key] = $item + ($output[$key] ?? 0);
    };

    
array_walk_recursive($input$sumValues);

    
print_r([
        
111 => $output,
    ]);
?>
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback