A simple design feature in PHP’s array syntax makes it possible to create arrays of more than one dimension. In fact, they can be as many dimensions as you like (although it’s a rare application that goes further than three).
That feature is the ability to include an entire array as a part of another one, and to be able to keep on doing so, just like the old rhyme: “Big fleas have little fleas upon their backs to bite ’em. Little fleas have lesser fleas, add flea, ad infinitum.”
Let’s look at how this works by taking the associative array in the previous example and extending it—see Example 6-10.
<?php $products = array( 'paper' => array( 'copier' => "Copier & Multipurpose", 'inkjet' => "Inkjet Printer", 'laser' => "Laser Printer", 'photo' => "Photographic Paper"), 'pens' => array( 'ball' => "Ball Point", 'hilite' => "Highlighters", 'marker' => "Markers"), 'misc' => array( 'tape' => "Sticky Tape", 'glue' => "Adhesives", 'clips' => "Paperclips") ); echo "<pre>"; foreach ($products as $section => $items) foreach ($items as $key => $value) echo "$section:\t$key\t($value)<br>"; echo "</pre>"; ?>
To make things clearer now that the code is starting to grow, I’ve
renamed some of the elements. For example, seeing as the previous array
$paper
is now just a subsection of a
larger array, the main array is now called $products
. Within this array there are three
items, paper
, pens
, and misc
, and each of these contains another array
with key/value pairs.
If necessary, these subarrays could have contained even further
arrays. For example, under ball
there
might be an array containing all the different types and colors of
ballpoint pens available in the online store. But for now, I’ve restricted
the code to just a depth of two.
Once the array data has been assigned, I use a pair of nested
foreach...as
loops to print out the
various values. The outer loop extracts the main sections from the top
level of the array, and the inner loop extracts the key/value pairs for
the categories within each section.
As long as you remember that each level of the array works the same way (it’s a key/value pair), you can easily write code to access any element at any level.
The echo
statement makes use of
the PHP escape character \t
, which
outputs a tab. Although tabs are not normally significant to the web
browser, I let them be used for layout by using the <pre>...</pre>
tags, which tell the
web browser to format the text as preformatted and monospaced, and
not to ignore whitespace characters such as tabs and
line feeds. The output from this code looks like the following:
paper: copier (Copier & Multipurpose) paper: inkjet (Inkjet Printer) paper: laser (Laser Printer) paper: photo (Photographic Paper) pens: ball (Ball Point) pens: hilite (Highlighters) pens: marker (Markers) misc: tape (Sticky Tape) misc: glue (Adhesives) misc: clips (Paperclips)
You can directly access a particular element of the array using square brackets, like this:
echo $products['misc']['glue'];
which outputs the value “Adhesives”.
You can also create numeric multidimensional arrays that are accessed directly by indexes rather than by alphanumeric identifiers. Example 6-11 creates the board for a chess game with the pieces in their starting positions.
<?php $chessboard = array( array('r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'), array('p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'), array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '), array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '), array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '), array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '), array('P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'), array('R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R')); echo "<pre>"; foreach ($chessboard as $row) { foreach ($row as $piece) echo "$piece "; echo "<br />"; } echo "</pre>"; ?>
In this example, the lowercase letters represent black pieces and
the uppercase white. The key is r=rook,
n=knight, b=bishop,
k=king, q=queen, and
p=pawn. Again, a pair of nested foreach...as
loops walk through the array and
display its contents. The outer loop processes each row into the variable
$row
, which itself is an array, because
the $chessboard
array uses a subarray
for each row. This loop has two statements within it, so curly braces
enclose them.
The inner loop then processes each square in a row, outputting the
character ($piece
) stored in it,
followed by a space (to square up the printout). This loop has a single
statement, so curly braces are not required to enclose it. The <pre>
and </pre>
tags ensure that the output
displays correctly, like this:
r n b q k b n r p p p p p p p p P P P P P P P P R N B Q K B N R
You can also directly access any element within this array using square brackets, like this:
echo $chessboard[7][3];
This statement outputs the uppercase letter Q
, the eighth element down and the fourth along
(remembering that array indexes start at 0, not 1).