Iterating a list of pairs normally costs two lines at the top of the loop body to name the parts. list() in the foreach itself does the naming in the place where the reader is already looking.
$ranges = [[0, 99], [100, 499], [500, 9999]];
foreach ($ranges as list($from, $to)) {
printf("%d-%dn", $from, $to);
}
It only unpacks numerically indexed arrays, so a list of associative rows still needs the explicit assignments. Nested list() works too, though a structure deep enough to need it is usually asking for a small value object instead.