For the first two, once they're fixed so that they'll actually parse (by putting "array" in before the '(', as NogDog notes), the code is simply bizarre: you're building the entire array, one element at a time, and then throwing it away and building it again all at once. So the difference is that you shouldn't do it in either of the first two ways - which is probably why the PHP manual doesn't mention anything like it anywhere. 🙂
$array = array(
$array[] = 'foo',
$array[] = 'bar'
);
Before it can do the array(...) part, PHP needs to evaluate the expressions inside to find out what their values are, because it's those values that go in the array. The value of an assignment is the value of the right-hand side of the assignment, which also has the side effect of setting the variable on the left-hand side to the same value (that's what assignment is for). Doing all of them at once in the same statement makes it a little hard to see, but we can use temporary variables to spread them out a bit so that there is one assignment per statement and so that only the assignment's side-effect is used. That makes the order in which they're executed a bit clearer:
$foo_temp = 'foo';
$array[] = $foo_temp;
$bar_temp = 'bar';
$array[] = $bar_temp;
$array = array(
$foo_temp,
$bar_temp
);
Now, what happens. $foo_temp is given the value 'foo'. Then a new array called $array is created, and the value of $foo_temp is put in its 0th element. $bar_temp is given the value 'bar', and that's also put in to $array as its 1st element. After the first four lines we have "foo" in $array[0] and "bar" in $array[0].
In the last statement we throw $array out the window and replace it with a new array that has "foo" as its 0th element and "bar" as its 1st.
The second example is exactly the same, except the first array that's built and then thrown away before you have a chance to look at it had "foo" as its 1st element and "bar" as its 2nd.
The third method makes more sense: create an array and then append elements to it. As NogDog points out, if you already have all the elements on hand it's more efficient to build the array all at once. But maybe you don't, hence the [] notation.
Nothing really to do with multidimensional arrays here, just a faulty understanding of array construction generally. If you want a multidimensional array, just replace "foo" and "bar" in the discussion above with something like array("one"=>"value 1.1", "two"=>"value 1.2").
Huh. So much for my 1<<14th post being dazzling.