This is a good question. On a basic level, array_map and array_walk can be used almost interchangably.
Array_map works on multiple arrays, working on each value of an array at a time. You cannot work with keys on the highest level array. Each corresponding offset in each array is compared against the other:
The results are:
function cb($a, $b)
return $a + $b;
$a1 = array(1, 3, 5);
$a2 = array(2, 4, 6);
$ar = array_map('cb', $a1, $a2);
In the event that an offset is unset, it treats it as null instead.
 => 3
 => 7
 => 11
Array_walk only works on one array, and is used to manipulate it from either a key or value perspective. You must specify the value as a reference if you want it to change, it will ignore any type of return.
Array_filter is used to separate your array into different parts. It does this by a boolean comparator, so you only return true or false. The example on the API is great actually, the odd/even number splitting makes great sense. Array_filter cannot be used to modify your array.
Does that help you out?