RU beehive logo ITEC dept promo banner
ITEC 325
2013spring
ibarland

homelectsexamshws
D2Lbreeze (snow day)

lect04a
processing input; array functions

We've been talking about input forms (html elements), and then php scripts to process a submitted form:

When creating a page which includes something typed in by the user (from a previous text-input), we must be careful! What could the user have typed, that would goof up our web page?

Quick q: suppose a user types:

  hi
<3
in a textarea whose name is msg. What is


We have seen arrays, and mentioned that if they have all-numeric indices (keys) then we can process them with a for loop or a while loop, using the same syntax that Java and Javasript happen to use.

Then we saw that if an array has keys which aren't all numeric, we can use a foreach loop to process them:

  $myData = array( 'hi' => 'hallo', 'good day' => 'guten Tag', 'see you later' => 'auf wiedersehen' );

  foreach ($mydata as $german) {
    echo $german, "\n";
    }

  foreach ($mydata as $english => $german) {
    echo "You say '$english', I say '$german'.\n";
    }
The foreach loop is of course one way to process each element of the $_POST array (if you didn't want code specific/different for each input form).


File timestameps (and, directory-processing)

When looking at files, it can be nice to include their most recently

Before calling filemtime (which takes in a file-name, and returns a date):

  ; Either:
  ini_set('date.timezone','America/New_York');
  date_default_timezone_set('America/New_York');

  echo strtotime('2012-Feb-08 11:03:27');   // don't use '2012.Feb.08 ...'; it returns null.
  echo date('Y-M-d H:m:s',234234234);

Look at the documentation for scandir.
Since it returns an array of filenames, it's a natural match to use with other functions that want an array of strings: For example, echo htmlLines( scandir( '/ibarland/Tmp' ) );


array_map

Recall from hw03: we wanted an English list of hyperlinks, separated by commas, with the word "and" before the last item. And you just wrote a function for making an English list, and you called that. The array you pass in must be an array of URLs.

To create the array, hopefully you also used your function hyperlink, written from hw02. (If you wrote the same long HTML a tag over and over, that's a sign that a function would be better.) So you might have a loop:

  $URLsAsText = array( "http://d20srd.org", "http://www.radford.edu", "http://google.com" );

  $URLsAsHTML = array();
  foreach ($URLsAsText AS $url) {
     $URLsAsHTML[] = hyperlink($url);
     }

  echo "It should appeal to ", commaSeparatedList( $URLsAsHTML ), "."
  

Any other repeated stuff? Hmm, the “http:” prefix was kinda annoying, but writing a loop for that seems definite overkill.
(Design Question: Should hyperlink prepend a http:?)

It's kinda annoying to keep writing loops that make a new array of updated values. Most of the loop is very rote — the only part that differs is the particular rule to transform the individual element to the new element. (In the example above, the answer is “the function hyperlink”.)

There is a handy function, array_map: You pass it an array of data, and you pass it the rule (function) on how to transform each individual datum, and it gives you back the entire transformed array. So our loop above gets turned in to:

  $URLsAsText = array( "http://d20srd.org", "http://www.radford.edu", "http://google.com" );
  $URLsAsHTML = array_map( $URLsAsText, "hyperlink" );
  echo "It should appeal to ", commaSeparatedList( $URLsAsHTML ), ".";
or we could even get rid of the intermediate variable, if we don't want to save the result1:
  $URLsAsText = array( "http://d20srd.org", "http://www.radford.edu", "http://google.com" );
  echo "It should appeal to ", 
       commaSeparatedList( array_map( $URLsAsText, "hyperlink" ) ),
       ".";

Finally, note that we can also handle the “prepend “http://” to each item” issue. We could make a separate function and apss that to array_map, or we could use an anonymous function:

  $URLsAsText = array_map( array( "d20srd.org", "www.radford.edu", "google.com" ),
                           function ($domain) { return "http://" . $domain; } );


1 Heck, if you don't even want to name the original array, you could inline that. This is arguably in-lining too much, but that can be an issue of taste (and requires taking care with indentation):

  echo "It should appeal to ", 
       commaSeparatedList( array_map( array( "http://d20srd.org",
                                             "http://www.radford.edu",
                                             "http://google.com" ),
                                      "hyperlink" ) ),
       ".";
     

homelectsexamshws
D2Lbreeze (snow day)


©2012, Ian Barland, Radford University
Last modified 2013.Feb.22 (Fri)
Please mail any suggestions
(incl. typos, broken links)
to ibarlandradford.edu
Powered by PLT Scheme