/*
Computes product of array except self.
nums = input array
size = number of elements
returns an array containing the result
*/
function productExceptSelf(array $nums) {
$size = count($nums);
$answer = array_fill(0, $size, 1);
// ---- Prefix products ----
// answer[i] gets product of all elements before i
$prefix = 1;
for ($i = 0; $i < $size; $i++) {
$answer[$i] = $prefix; // store prefix product
$prefix *= $nums[$i]; // update prefix
// Example for nums = [5,2,3,4]:
// prefix values: 1, 5, 10, 30
}
// ---- Suffix products ----
// Multiply each answer[i] by product of all elements after i
$suffix = 1;
for ($i = $size - 1; $i >= 0; $i--) {
$answer[$i] *= $suffix; // combine prefix * suffix
$suffix *= $nums[$i]; // update suffix
// suffix values: 1, 4, 12, 24, 120
// final answer: 24, 60, 40, 30
// 24 (24*1) 60 (12*5) 40 (10*4) 30 (30*1)
}
return $answer;
}
// Main program
$arr = [5, 2, 3, 4];
$result = productExceptSelf($arr);
echo "Result: ";
foreach ($result as $x) {
echo $x . " ";
}
/*
run:
Result: 24 60 40 30
*/