Filtering keeps only the values that pass a condition.

filter condition A filter condition decides whether each candidate value should be kept.

Array Filtering

minimum
array_filtering.php
Replay: real traced execution (multi-file project)
<?php
$minimum = 5;
$kept = 0;
$sum = 0;

foreach ([2, 5, 7, 9] as $value) {
    if ($value >= $minimum) {
        $kept = $kept + 1;
        $sum = $sum + $value;
    }
}

echo "minimum=" . $minimum . "\n";
echo "kept=" . $kept . "\n";
echo "sum=" . $sum . "\n";
<?php
$minimum = 3;
$kept = 0;
$sum = 0;

foreach ([2, 5, 7, 9] as $value) {
    if ($value >= $minimum) {
        $kept = $kept + 1;
        $sum = $sum + $value;
    }
}

echo "minimum=" . $minimum . "\n";
echo "kept=" . $kept . "\n";
echo "sum=" . $sum . "\n";
<?php
$minimum = 7;
$kept = 0;
$sum = 0;

foreach ([2, 5, 7, 9] as $value) {
    if ($value >= $minimum) {
        $kept = $kept + 1;
        $sum = $sum + $value;
    }
}

echo "minimum=" . $minimum . "\n";
echo "kept=" . $kept . "\n";
echo "sum=" . $sum . "\n";
  1. $minimum ← 5, $kept ← 0, $sum ← 0

    1<?php2$minimum→ 5 = 5; //@minimum=3, 73$kept→ 0 = 0;4$sum→ 0 = 0;
  2. foreach ([2, 5, 7, 9] as $value)

    pass 1 of 4
    6foreach ([2, 5, 7, 9] as $value2) {7    if ($value >= $minimum) {8        $kept = $kept + 1;
    All 4 passes — pass 1 is the card above
    pass$value
    12
    25
    37
    49
  3. $kept ← 1, $sum ← 5

    pass 1 of 3
    6foreach ([2, 5, 7, 9] as $value) {7    if ($value5 >= $minimum5) {8        $kept→ 1 = $kept + 1;9        $sum→ 5 = $sum + $value5;10    }
    All 3 passes — pass 1 is the card above
    pass$value$kept$sum
    150 10 5
    271 25 12
    392 312 21
  4. echo "minimum=" . $minimum . " ";

    13echo "minimum=" . $minimum5 . "\n";14echo "kept=" . $kept3 . "\n";15echo "sum=" . $sum21 . "\n";
    outputminimum=5
    kept=3
    sum=21
  1. $minimum ← 3, $kept ← 0, $sum ← 0

    1<?php2$minimum→ 3 = 3;3$kept→ 0 = 0;4$sum→ 0 = 0;
  2. foreach ([2, 5, 7, 9] as $value)

    pass 1 of 4
    6foreach ([2, 5, 7, 9] as $value2) {7    if ($value >= $minimum) {8        $kept = $kept + 1;
    All 4 passes — pass 1 is the card above
    pass$value
    12
    25
    37
    49
  3. $kept ← 1, $sum ← 5

    pass 1 of 3
    6foreach ([2, 5, 7, 9] as $value) {7    if ($value5 >= $minimum3) {8        $kept→ 1 = $kept + 1;9        $sum→ 5 = $sum + $value5;10    }
    All 3 passes — pass 1 is the card above
    pass$value$kept$sum
    150 10 5
    271 25 12
    392 312 21
  4. echo "minimum=" . $minimum . " ";

    13echo "minimum=" . $minimum3 . "\n";14echo "kept=" . $kept3 . "\n";15echo "sum=" . $sum21 . "\n";
    outputminimum=3
    kept=3
    sum=21
  1. $minimum ← 7, $kept ← 0, $sum ← 0

    1<?php2$minimum→ 7 = 7;3$kept→ 0 = 0;4$sum→ 0 = 0;
  2. foreach ([2, 5, 7, 9] as $value)

    pass 1 of 4
    6foreach ([2, 5, 7, 9] as $value2) {7    if ($value >= $minimum) {8        $kept = $kept + 1;
    All 4 passes — pass 1 is the card above
    pass$value$minimum$kept$sum
    12
    25
    3770 10 7
    4971 27 16
  3. $kept ← 1, $sum ← 7

    pass 1 of 2
    6foreach ([2, 5, 7, 9] as $value) {7    if ($value7 >= $minimum7) {8        $kept→ 1 = $kept + 1;9        $sum→ 7 = $sum + $value7;10    }
  4. $kept ← 2, $sum ← 16

    pass 2 of 2
    6foreach ([2, 5, 7, 9] as $value) {7    if ($value9 >= $minimum7) {8        $kept→ 2 = $kept + 1;9        $sum→ 16 = $sum + $value9;10    }
  5. echo "minimum=" . $minimum . " ";

    13echo "minimum=" . $minimum7 . "\n";14echo "kept=" . $kept2 . "\n";15echo "sum=" . $sum16 . "\n";
    outputminimum=7
    kept=2
    sum=16

Keep or Drop

  1. Start with values [2, 5, 7, 9].
  2. Check each value against minimum.
  3. Keep values that pass the check.
  4. Count kept values and add them into sum. | Value | >= 5? | Action | | --- | --- | --- | | 2 | no | drop | | 5 | yes | keep | | 7 | yes | keep | | 9 | yes | keep |

Exercise: array_filtering.php

Filter values with an if check, count the kept values, and add their sum