0

I have 2D array (showed bellow) - output of wp_query (Wordpress).

I need to group the arrays by index 0, 1, 2 values (lets think that the primary key is composed from these values and it should be unique in result table) and sum the index 3 values.

array(4) {
  [0]=>  string(6) "Team 1"
  [1]=>  string(6) "Jack"
  [2]=>  string(6) "Daniels"
  [3]=>  string(2) "10"
}
array(4) {
  [0]=>  string(6) "Team 1"
  [1]=>  string(3) "Jan"
  [2]=>  string(6) "Novak"
  [3]=>  string(2) "33"
}
array(4) {
  [0]=>  string(6) "Team 2"
  [1]=>  string(4) "John"
  [2]=>  string(3) "Doe"
  [3]=>  string(2) "11"
}
array(4) {
  [0]=>  string(6) "Team 2"
  [1]=>  string(4) "Jane"
  [2]=>  string(3) "Doe"
  [3]=>  string(2) "18"
}
array(4) {
  [0]=>  string(6) "Team 1"
  [1]=>  string(6) "Jack"
  [2]=>  string(6) "Daniels"
  [3]=>  string(1) "5"
}
array(4) {
  [0]=>  string(6) "Team 1"
  [1]=>  string(3) "Jan"
  [2]=>  string(6) "Novak"
  [3]=>  string(2) "33"
}
array(4) {
  [0]=>  string(6) "Team 2"
  [1]=>  string(4) "John"
  [2]=>  string(3) "Doe"
  [3]=>  string(2) "11"
}
array(4) {
  [0]=>  string(6) "Team 2"
  [1]=>  string(4) "Jane"
  [2]=>  string(3) "Doe"
  [3]=>  string(2) "18"
}

ETC...

Output should be someting like:

array(4) {
  [0]=>  string(6) "Team 1"
  [1]=>  string(6) "Jack"
  [2]=>  string(6) "Daniels"
  [3]=>  string(2) "15" (5+10)
}
array(4) {
  [0]=>  string(6) "Team 1"
  [1]=>  string(3) "Jan"
  [2]=>  string(6) "Novak"
  [3]=>  string(2) "66" (33+33)
}
array(4) {
  [0]=>  string(6) "Team 2"
  [1]=>  string(4) "John"
  [2]=>  string(3) "Doe"
  [3]=>  string(2) "22" (11+11)
}
array(4) {
  [0]=>  string(6) "Team 2"
  [1]=>  string(4) "Jane"
  [2]=>  string(3) "Doe"
  [3]=>  string(2) "36" (18+18)
}
}

I tried to do this by recursive for loops, but I cannot find the reason why is it not working properly.

$vysledna_tabulka = array();
$aktualni;

foreach($seznam_vsech_hracu_vsech_tymu as $radek){

    if(empty($vysledna_tabulka)){
        array_push($vysledna_tabulka,$radek);
    } else{
        foreach($vysledna_tabulka as $vysledny_radek){
            if($vysledny_radek[0]==$radek[0] && $vysledny_radek[1]==$radek[1] && $vysledny_radek[2]==$radek[2]){
                $vysledny_radek[3]+=$radek[3];
            } else {
                $aktualni = $radek; 
            }
        }    
        array_push($vysledna_tabulka,$aktualni);   
    }
}

I think there should be a better way to do this. Is there anyone who could help me?

Thanks.

RiggsFolly
  • 93,638
  • 21
  • 103
  • 149
Eduard
  • 3
  • 3

1 Answers1

0

I would create a key from the first three values of your array elements and then create a new array using this key. Like this:

<?php

$teamArray = [
  [
    "Team 1",
    "Jack",
    "Daniels",
    "10",
  ],
  [
    "Team 1",
    "Jan",
    "Novak",
    "33",
  ],
  [
    "Team 2",
    "John",
    "Doe",
    "11",
  ],
  [
    "Team 2",
    "Jane",
    "Doe",
    "18",
  ],
  [
    "Team 1",
    "Jack",
    "Daniels",
    "5",
  ],
  [
    "Team 1",
    "Jan",
    "Novak",
    "33",
  ],
  [
    "Team 2",
    "John",
    "Doe",
    "11",
  ],
  [
    "Team 2",
    "Jane",
    "Doe",
    "18",
  ]
];

$result = [];
foreach ($teamArray as $team) {
  $key = $team[0] . $team[1] . $team[2];
  if (isset($result[$key])) {
    $result[$key][3] += $team[3];
  }
  else {
    $result[$key] = $team;
  }
}

var_dump($result);
var_dump(array_values($result));

This gives you:

array(4) {
  ["Team 1JackDaniels"]=>
  array(4) {
    [0]=>
    string(6) "Team 1"
    [1]=>
    string(4) "Jack"
    [2]=>
    string(7) "Daniels"
    [3]=>
    int(15)
  }
  ["Team 1JanNovak"]=>
  array(4) {
    [0]=>
    string(6) "Team 1"
    [1]=>
    string(3) "Jan"
    [2]=>
    string(5) "Novak"
    [3]=>
    int(66)
  }
  ["Team 2JohnDoe"]=>
  array(4) {
    [0]=>
    string(6) "Team 2"
    [1]=>
    string(4) "John"
    [2]=>
    string(3) "Doe"
    [3]=>
    int(22)
  }
  ["Team 2JaneDoe"]=>
  array(4) {
    [0]=>
    string(6) "Team 2"
    [1]=>
    string(4) "Jane"
    [2]=>
    string(3) "Doe"
    [3]=>
    int(36)
  }
}
array(4) {
  [0]=>
  array(4) {
    [0]=>
    string(6) "Team 1"
    [1]=>
    string(4) "Jack"
    [2]=>
    string(7) "Daniels"
    [3]=>
    int(15)
  }
  [1]=>
  array(4) {
    [0]=>
    string(6) "Team 1"
    [1]=>
    string(3) "Jan"
    [2]=>
    string(5) "Novak"
    [3]=>
    int(66)
  }
  [2]=>
  array(4) {
    [0]=>
    string(6) "Team 2"
    [1]=>
    string(4) "John"
    [2]=>
    string(3) "Doe"
    [3]=>
    int(22)
  }
  [3]=>
  array(4) {
    [0]=>
    string(6) "Team 2"
    [1]=>
    string(4) "Jane"
    [2]=>
    string(3) "Doe"
    [3]=>
    int(36)
  }
}

If you need to remove the keys from your $result array you could use array_value as shown above.

user1915746
  • 466
  • 4
  • 16