Jack Logan
Jack Logan

Reputation: 95

Given two arrays combine common values

$names = ['john','brian','john','steven','michael','paul','mark','paul','brian'];
$money = [2, 4, 3, 7, 5, 8, 20, -2, 4];

The indexes of $names and $money correspond to each other. I need to find the most efficient way to add common $money to each $names and print only the even values. For example, john appears two times, with 2 and 3 money. So johnhas 5 money.

Desired output:

mark: 20
brian: 8
paul: 6

I am thinking of looping through each array, but this is O(n^2) Is there an easier way?

Upvotes: 0

Views: 44

Answers (4)

brevis
brevis

Reputation: 1201

Make associative array (hash) for result:

$names = ['john','brian','john','steven','michael','paul','mark','paul','brian'];
$money = [2, 4, 3, 7, 5, 8, 20, -2, 4];

$result = [];
for ($i = 0; $i < count($names); $i++) {
    if (!isset($result[$names[$i]])) {
        $result[$names[$i]] = 0;
    }
    $result[$names[$i]] += $money[$i];
}

arsort($result); // reverse (big first) sort by money 

print_r($result);

Upvotes: 1

Daniel
Daniel

Reputation: 539

Maybe you'll need a check, if both arrays have the same size.

$names = ['john','brian','john','steven','michael','paul','mark','paul','brian'];
$money = [2, 4, 3, 7, 5, 8, 20, -2, 4];

$result = [];

foreach ($names as $index => $name) {
    if (empty($result[$name]) {
        $result[$name] = $money[$index];
    } else {
        $result[$name] += $money[$index];
    }
}

print_r($result);

Upvotes: 0

Glidarn
Glidarn

Reputation: 285

You just have to loop through $names once and set name as key in a result- variable.

$names = ['john','brian','john','steven','michael','paul','mark','paul','brian'];
$money = [2, 4, 3, 7, 5, 8, 20, -2, 4];

$data = [];
foreach ($names as $key => $name) {
    if (!isset($data[$name])) {
        $data[$name] = 0;
    }

    $data[$name] += $money[$key];
}

print_r($data);

Upvotes: 0

myxaxa
myxaxa

Reputation: 1381

just loop through names and use it keys for money array:

$names = ['john','brian','john','steven','michael','paul','mark','paul','brian'];
$money = [2, 4, 3, 7, 5, 8, 20, -2, 4];

$res = [];
foreach ($names as $key => $value) {
    $res[$value] = isset($res[$value]) ? $res[$value] + $money[$key] : $money[$key];
}
var_dump($res);

Upvotes: 0

Related Questions