Your loop is operating on copies of the original elements; changes to $type2 will not be visible in $data because $type2 is a copy.
You can solve this by iterating over all arrays by key, then indexing into $data with those keys to remove the value:
foreach ($data as $k1 => $region ):
  foreach ($region as $k2 => $type):
   foreach ($type as $k3 => $type2):
    foreach ($type2 as $k4 =>$val):
    if ($val=='background-color: FFFFFF;' || $val=='') {
        unset($data[$k1][$k2][$k3][$k4]);
    }
    endforeach;
   endforeach;
  endforeach;
endforeach;
Of course this is ugly, but that's four nested loops will do. There is also the option if iterating by reference instead of grabbing keys, but personally I dislike that because of the nice opportunity to write bugs by reusing the abandoned references after the loop has ended. Especially in this case I dislike it to the fourth power.