Stacks, Queues and Sets

Arrays can be used in a number of different ways. This can include stacks, queues, and sets. I personally don’t use these functions very often but It can’t hurt to go over them for before taking the Zend Certification exam.

Stacks are a Last in, First out (LIFO) structure which means that the first element you put on the stack is only available when all other elements are removed. Just like a stack of papers. This is acheived by using the array_push and array_pop functions.

Here is a simple little example:

  1.  
  2. $stack_array = array();
  3. array_push($stack_array,"zend");
  4. //You can add multiple values at once
  5. array_push($stack_array,"php","certification");
  6. $last_in = array_pop($stack_array); //last_in will house "certification"
  7.  

The array_push function is very similar to “$a[] = $value” and the latter is actually much faster because no function call is made.

Next up is the queue which is a first in first out data structure. Just like a line at a movie theater, the first elements added to the queue get their choice of seats. Queue manipulation is acheived using the array_shift, array_unshift, and any of the functions outlined above.

The array_shift function will remove and return the element from the front of the array and the array_unshift will prepend an element to the front of the array. If both these functions are used together then the array will work like a sort of backwards stack but if array_shift is used with array_push or if array_unshift is used with array_pop then the array will act as a queue.

  1.  
  2. $stack_array = array(’zend’, ’php’, ’cert’);
  3. $first = array_shift($stack); //$first now houses ‘zend’
  4. array_unshift($stack, ’dont fail’); //adds ‘dont fail’ to the beginning of the array.
  5.  

There are a few functions that mimic set functionality using php arrays. These are array_diff(), array_intersect, array_intersect_key(), array_intersect_assoc(),array_intersect_ukey(), and array_intersect_uassoc().

The function array_diff() is used to compute the difference between two arrays:

PHP Sorting Functions

In all the countless hours I’ve spent with php, I’ve maybe used three or four of these sorting functions. I really had no idea that there is a total of eleven functions used for sorting arrays. Anyway, I’m betting that it may be useful to have these memorized before I take the Zend PHP Certification Exam so here is a brief overview of each one.

A lot of the sorting functions have an optional flag that may be used to modify the sorting behavior.
The available flags are:

SORT_REGULAR – compare items normally (don’t change types)
SORT_NUMERIC – compare items numerically
SORT_STRING – compare items as strings
SORT_LOCALE_STRING – compare items as strings, based on the current locale.

All of these functions sort arrays. I don’re really think it’s necessary to type out an example for each one but I will go into greater detail about some. Each function will return a boolean which is true on success and false on failure.

  1.  
  2. bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

This sort function will arrange the elements from lowest to highest.
Array indices do NOT maintain their correlation with the array elements they are associated with.

  1.  
  2. bool rsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

This one will arrange the elements from highest to lowest (Reverse Sort).

  1.  
  2. bool natsort ( array &$array )
  3.  

This sorting function will sort the array alphanumerically. This is more “natural” for most people.
Here is a comparison between the regular sort and this natural sort from the
php.net site
:

  1.  
  2. <?php
  3. $array1 = $array2 = array("img12.png", "img10.png", "img2.png", "img1.png");
  4.  
  5. asort($array1);
  6. echo "Standard sorting\n";
  7. print_r($array1);
  8.  
  9. natsort($array2);
  10. echo "\nNatural order sorting\n";
  11. print_r($array2);
  12. ?>
  13. Which will output:
  14. Standard sorting
  15. (
  16.     [3] => img1.png
  17.     [1] => img10.png
  18.     [0] => img12.png
  19.     [2] => img2.png
  20. )
  21.  
  22. Natural order sorting
  23. (
  24.     [3] => img1.png
  25.     [2] => img2.png
  26.     [1] => img10.png
  27.     [0] => img12.png
  28. )
  29.  
  1.  
  2. bool natcasesort ( array &$array )
  3.  

A case insensitive version of natsort.

  1.  
  2. bool ksort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

Sorts an array by the key. It also maintains the key to data correlations.

  1.  
  2. bool krsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

Sorts by key, but in reverse.

  1.  
  2. bool asort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

This is very similar to the regular sort outlined above except the array indices maintain
their correlation with the array elements they are associated with.

  1.  
  2. bool arsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

Similar to the asort but reversed.

  1.  
  2. bool usort ( array &$array , callback $cmp_function )
  3.  

This function allows for a custom comparsion function to create different sorting methods. This function should accept only two parameters and return an integer less than, equal to,
or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. Here’s an example:

  1.  
  2. <?php
  3. function cmp($a, $b)
  4. {
  5.     if ($a == $b) {
  6.         return 0;
  7.     }
  8.     return ($a < $b) ? -1 : 1;
  9. }
  10.  
  11. $a = array(3, 2, 5, 6, 1);
  12.  
  13. usort($a, "cmp");
  14.  
  15. foreach ($a as $key => $value) {
  16.     echo "$key: $value\n";
  17. }
  18. ?>
  19.  
  20.  
  1.  
  2. bool uasort ( array &$array , callback $cmp_function )
  3.  

This is similar to usort except the array indices maintain their
correlation with the array elements they are associated with.

  1.  
  2. bool uksort ( array &$array , callback $cmp_function )
  3.  

This last sort function works similar to the previous two where you can define a custom comparison function. The difference is that this one works on the keys and it also maintains the correlation with the elements.

There is also a nice comparison of all these functions at php.net

PHP Array Cursors

I don’t recommend ever using these functions because a foreach loop is so much simpler and shorter. The only reason I’m writing about these is bacause I have almost never used them and they may just be on the Zend PHP Certification exam.

There are a number of functions designed specifically for manipulating array pointers. Most examples that I’ve seen use these functions during some sort of array iteration. When starting an iteration over an array, the first step is usually to reset the pointer to its initial position using the reset() function. After that, moving forward or backwards by one position is done using prev() and next(). At any given point, we can access the value of the current element using current() and its key using key(). Here’s a simple example:

  1.  
  2. $array = array(’foo’ => ’bar’, ’baz’, ’bat’ => 2);
  3. function displayArray($array) {
  4.         reset($array);
  5.         while (key($array) !== null) {
  6.                 echo key($array) .": " .current($array) . PHP_EOL;
  7.                 next($array);
  8.         }
  9. }
  10.  

The displayArray function above will display all the values in an array. Reset() is called first to return the internal array pointer to the first element. Next, using a while loop, the current key and value is displayed using the key() and current() functions. Finally, the array pointer is advanced, using next().

Since you can iterate back-and-forth within an array by using its pointer, you could—in theory—start your iteration from the last element (using the end() function to reset the pointer to the bottom of the array) and then making your way to the beginning:

  1.  
  2. $a = array (1, 2, 3);
  3. end($a);
  4. while (key ($array) !== null) {
  5.         echo key($array) .": " .current($array) . PHP_EOL;
  6.         prev($array);
  7. }
  8.  

So I guess that last example may be useful…but it’s still probably easier to reverse the entire array and use a foreach.

Anyway, if these are on the Zend PHP Certification exam, I shouldn’t have a problem.

Comparing Arrays in PHP

Array-to-array comparison is a relatively rare occurrence in the real world of PHP (at least for me), but it can be performed using a set of operators. Like for other types, the equivalence and identity operators can be used for this purpose:

  1.  
  2. $a = array (1, 2, 3);
  3. $b = array (1 => 2, 2 => 3, 0 => 1);
  4. $c = array (’a’ => 1, ’b’ => 2, ’c’ => 3);
  5. var_dump ($a == $b); // True
  6. var_dump ($a === $b); // False
  7. var_dump ($a == $c); // False
  8. var_dump ($a === $c); // False
  9.  

As you can see, the equivalence operator == returns true if both arrays have the same number of elements with the same values and keys, regardless of their order. The identity operator ===, on the other hand, returns true only if the array contains the same key/value pairs in the same order.

Similarly, the inequality and non-identity operators can determine whether two arrays are different:

  1.  
  2. $a = array (1, 2, 3);
  3. $b = array (1 => 2, 2 => 3, 0 => 1);
  4. var_dump ($a != $b); // False
  5. var_dump ($a !== $b); // True
  6.  

Once again, the inequality operator only ensures that both arrays contain the same elements with the same keys, whereas the non-identity operator also verifies their position.

Apparently arrays are covered heavily on the Zend PHP Certification Exam so the next few posts will cover arrays.