/**
 * array_reduce() 함수를 사용해서
 * 배열의 모든 요소를 더해 누적된 하나의 값을 생성하는 예제
 */

// array_reduce() 함수를 적용할 배열
$array = [1, 2, 3, 4, 5];

// 개발자가 직접 작성한 콜백 함수
function sum($total, $number) {
	// 이전의 결과 값과 현재 요소를 더합니다.
	return $total + $number;
}

// 배열의 모든 요소에 콜백 함수를 적용하여 집계한 하나의 결과 값을 반환
$result = array_reduce($array, 'sum');

echo $result; // 출력: 15
array_reduce(array $array, callable $callback, mixed $initial = null): mixed
callback(mixed $carry, mixed $item): mixed
/**
 * 콜백 함수
 *
 * 기명 함수(사용자 정의 함수)나 익명 함수 등으로 사용할 수 있습니다.
 */


/* 콜백 함수를 기명 함수를 사용할 경우 */
function callback($carry, $item) { // 기명 함수 정의
	// 누적된 하나의 값 로직: 누적된 결과를 반환해야 합니다.
}

array_reduce($array, 'callback'); // 정의한 기명 함수명을 매개변수에 문자열로 직접 전달

/* 콜백 함수를 익명 함수로 사용할 경우 */
array_reduce($array, function($carry, $item) {
	// 누적된 하나의 값 로직: 누적된 결과를 반환해야 합니다.
});
$numbers = [1, 2, 3, 4, 5];

$sum = array_reduce($numbers, function ($carry, $item) {
    return $carry + $item;
});

echo "배열의 모든 요소를 더한 결과: $sum"; // 출력: '배열의 모든 요소를 더한 결과: 15'
$numbers = [2, 3, 4, 5];

$product = array_reduce($numbers, function ($carry, $item) {
    return $carry * $item;
}, 1); // 초기 누적 값은 1로 설정

echo "배열의 모든 요소를 곱한 결과: $product"; // 출력: '배열의 모든 요소를 곱한 결과: 120'
$numbers = [5, 3, 9, 2, 7];

$min = array_reduce($numbers, function ($carry, $item) {
    return ($item < $carry) ? $item : $carry;
}, $numbers[0]);

echo "배열의 최솟값: $min"; // 출력: '배열의 최솟값: 2'
$numbers = [5, 3, 9, 2, 7];

$max = array_reduce($numbers, function ($carry, $item) {
    return ($item > $carry) ? $item : $carry;
}, $numbers[0]);

echo "배열의 최댓값: $max"; // 출력: '배열의 최댓값: 9'
$words = ['Hello', ' ', 'World', '!'];

$concatenated = array_reduce($words, function ($carry, $item) {
    return $carry . $item;
}, '');

echo "배열의 모든 요소를 결합한 결과: $concatenated"; // 출력: '배열의 모든 요소를 결합한 결과: Hello World!'

// implode() 함수를 사용할 수 있습니다.
$implode = implode('', $words);
echo $implode;  // 출력: 'Hello World!'