Łączenie podobnych wierszy w tablicy

0

Witam,
Mam problem nie wiem jak z tablicy jak poniżej:

Array
(
    [0] => Array
        (
            [code] => 1
            [name] => bob
            [valueA] => 36
            [valueB] => 
        )

    [1] => Array
        (
            [code] => 2
            [name] => john
            [valueA] => 14
            [valueB] => 
        )

    [2] => Array
        (
            [code] => 1
            [name] => bob
            [valueA] => 
            [valueB] => 123
        )

    [3] => Array
        (
            [code] => 2
            [name] => john
            [valueA] => 
            [valueB] => 45
        )

)
1

Uzyskać taki rezultat:

Array
(
    [0] => Array
        (
            [code] => 1
            [name] => bob
            [valueA] => 36
            [valueB] => 123
        )

    [1] => Array
        (
            [code] => 2
            [name] => john
            [valueA] => 14
            [valueB] => 45
        )

)
1

Chodzi o to, żeby jeśli już istnieje dane imię, kod to nie duplikowało wierszy tylko w wolne miejsce przepisało tam gdzie jest wartość a ten duplikat usunęło.
Można prosić o jakieś wskazówki.

0
<?php

$rows = [
    ['id' => 5, 'a' => 10],
    ['id' => 3, 'a' => 2],
    ['id' => 5, 'b' => 4],
    ['id' => 3, 'b' => 1]
];

$results = [];
$keys = ['a', 'b'];

foreach ($rows as $row) {
    $id = $row['id'];
    if (!isset($results[$id])) {
        $results[$id] = $row;
        continue;
    }
                        
    foreach($keys as $key) {
        if (isset($row[$key])) {
            $results[$id][$key] = $row[$key];    
        }
    }
}

$results = array_values($results);

echo "<pre>";
var_dump($results);

?>
array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    int(5)
    ["a"]=>
    int(10)
    ["b"]=>
    int(4)
  }
  [1]=>
  array(3) {
    ["id"]=>
    int(3)
    ["a"]=>
    int(2)
    ["b"]=>
    int(1)
  }
}
1
Markuz napisał(a):

Prościej chyba będzie coś takiego:

<?php

$rows = [
    ['id' => 5, 'a' => 10],
    ['id' => 3, 'a' => 2],
    ['id' => 5, 'b' => 4],
    ['id' => 3, 'b' => 1]
];

$results = [];
foreach ($rows as $row) {
    $id = $row['id'];
	$results[$id] = ($results[$id] ?? []) + $row;
}

$results = array_values($results);

echo "<pre>";
var_dump($results);

?>
0

Dziękuje, działa.
A jak się bronić przed pustymi wartościami tak jak wspomnieliście?

1
amatorek napisał(a):

Dziękuje, działa.
A jak się bronić przed pustymi wartościami tak jak wspomnieliście?

Dżizas, pomyśl. Dostałeś rozwiązanie na tacy, daj też coś od siebie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1