Attribution:Except where otherwise noted, the contents of this document are Copyright 2012 Marty Stepp, Jessica Miller, and Victoria Kirst. All rights reserved. Any redistribution, reproduction, transmission, or storage of part or all of the contents in any form is prohibited without the author's expressed written permission.
Otherwise noted: Claude Anderson was given permission to modify the slides for CSSE 290 at Rose-Hulman by author Jessica Miller.
The authors' original slides, based on Web Programming Step by Step, can be seen at http://webstepbook.com.
Some of the examples in some days' slides are from David Fisher at Rose-Hulman, who was kind enough to allow me to use them.
My intention is to mark these examples with [DSF].
== vs. === if (3 == 3.0) print "== yes " if (3 === 3.0) print " === yes "
== yes
=== only returns TRUE if both values and types match.
Usually by value (except for objects).
But you can use & to specify pass-by-reference
function triple($n) {
$n = 3 * $n;
return $n;
}
function triple2(&$n) {
$n = 3 * $n;
return $n;
}
$n = 7;
print triple($n) . " ";
print $n . " ";
print triple2($n) . " ";
print $n;
21 7 21 21
$name = array(); # create $name = array(value0, value1, ..., valueN); $name[index] # get element value $name[index] = value; # set element value $name[] = value; # append
$a = array(); # empty array (length 0) $a[0] = 23; # stores 23 at index 0 (length 1) $a2 = array("some", "strings", "in", "an", "array"); $a2[] = "Ooh!"; # add string to end (at index 5)
$a = array(); $a[3] = 5; $a[5] = 7; print_r($a);
Array
(
[3] => 5
[5] => 7
)
| function name(s) | description |
|---|---|
count
|
number of elements in the array |
print_r
|
print array's contents |
array_pop,
array_push, array_shift,
array_unshift
|
using array as a stack/queue |
in_array,
array_search,
array_reverse, sort,
rsort,
shuffle
|
searching and reordering |
array_fill,
array_merge,
array_intersect, array_diff,
array_slice,
range
|
creating, filling, filtering |
array_sum,
array_product,
array_unique, array_filter,
array_reduce
|
processing elements |
$tas = array("MD", "BH", "KK", "HM", "JP");
for ($i = 0; $i < count($tas); $i++) {
$tas[$i] = strtolower($tas[$i]);
} # ("md", "bh", "kk", "hm", "jp")
$morgan = array_shift($tas); # ("bh", "kk", "hm", "jp")
array_pop($tas); # ("bh", "kk", "hm")
array_push($tas, "ms"); # ("bh", "kk", "hm", "ms")
array_reverse($tas); # ("ms", "hm", "kk", "bh")
sort($tas); # ("bh", "hm", "kk", "ms")
$best = array_slice($tas, 1, 2); # ("hm", "kk")
foreach loop
foreach ($array as $variableName) {
...
}
$stooges = array("Larry", "Moe", "Curly", "Shemp");
for ($i = 0; $i < count($stooges); $i++) {
print "Moe slaps {$stooges[$i]}\n";
}
foreach ($stooges as $stooge) {
print "Moe slaps $stooge\n"; # even himself!
}
Strings in PHP are mutable:
$s = "abcd"; $s[1]="x"; print "$s\n";
axcd
A very useful string function:
$s2 = htmlspecialchars('<p style="display:none">invisible</p>');
print $s2;
<p style="display:none">invisible</p>
Note:The output shown above is what we'd see if we "view source" for the page.
What does it look like on the actual web page?
$array = explode(delimiter, string); $string = implode(delimiter, array);
$s = "CSSE 290 01";
$a = explode(" ", $s); # ("CSSE", "290", "01")
$s2 = implode("...", $a); # "CSSE...290...01"
explode and implode convert between strings and arraysexplodenames.txtMartin D Stepp Jessica K Miller Victoria R Kirst
foreach (file("names.txt") as $name) {
$tokens = explode(" ", $name);
?>
<p> author: <?= $tokens[2] ?>, <?= $tokens[0] ?> </p>
<?php
}
author: Stepp, Marty
author: Miller, Jessica
author: Kirst, Victoria
$school = "UW"; # global ... function downgrade() { global $school; $suffix = "(Wisconsin)"; # local $school = "$school $suffix"; print "$school\n"; }
global statement
function name(parameterName = value, ..., parameterName = value) {
statements;
}
function print_separated($str, $separator = ", ") {
if (strlen($str) > 0) {
print $str[0];
for ($i = 1; $i < strlen($str); $i++) {
print $separator . $str[$i];
}
}
}
print_separated("hello"); # h, e, l, l, o
print_separated("hello", "-"); # h-e-l-l-o
NULL
$name = "Victoria";
$name = NULL;
if (isset($name)) {
print "This line isn't going to be reached.\n";
}
| function name(s) | category |
|---|---|
file,
file_get_contents, file_put_contents
|
reading/writing entire files |
basename,
file_exists,
filesize, fileperms,
filemtime,
is_dir, is_readable,
is_writable,
disk_free_space
|
asking for information |
copy,
rename,
unlink,
chmod, chgrp,
chown,
mkdir,
rmdir
|
manipulating files and directories |
glob,
scandir
|
reading directories |
contents of foo.txt |
file("foo.txt") |
file_get_contents("foo.txt") |
|---|---|---|
Hello how r u? I'm fine |
array( "Hello\n", # 0 "how r u?\n", # 1 "\n", # 2 "I'm fine\n" # 3 ) |
"Hello\n how r u?\n # a single \n # string I'm fine\n" |
file function returns lines of a file as an array (\n at end of each)file_get_contents returns entire contents of a file as a single string
file_put_contents writes a string into a file
file function# display lines of file $lines = file("todolist.txt"); foreach ($lines as $line) { # for ($i = 0; $i < count($lines); $i++) print $line; }
file returns the lines of a file as an array of strings
\n ; to strip it, use an optional second parameter:
$lines = file("todolist.txt", FILE_IGNORE_NEW_LINES);
foreach or for loop over lines of filelistlist($var1, ..., $varN) = array;
personal.txtMarty Stepp (206) 685 2181 570-86-7326
list($name, $phone, $ssn) = file("personal.txt");
...
list($area_code, $prefix, $suffix) = explode(" ", $phone);
list syntax (It's not a function) "unpacks" an array into a set of variables you declare
file and list to unpack it
| function | description |
|---|---|
glob |
returns an array of all file names that match a given pattern (returns a file path and name, such as "foo/bar/myfile.txt")
|
scandir |
returns an array of all file names in a given directory (returns just the file names, such as "myfile.txt")
|
glob can accept a general path with the * wildcard character (more powerful)
glob Example
# reverse all poems in the poetry directory
$poems = glob("poetry/poem*.dat");
foreach ($poems as $poemfile) {
$text = file_get_contents($poemfile);
file_put_contents($poemfile, strrev($text));
print "I just reversed " . basename($poemfile) . "\n";
}
glob can match a "wildcard" path with the * character
glob("foo/bar/*.doc") returns all .doc files in the foo/bar subdirectory
glob("food*") returns all files whose names begin with "food"
basename function strips any leading directory from a file path
basename("foo/bar/baz.txt") returns "baz.txt"
scandir Example
<ul>
<?php foreach (scandir("taxes/old") as $filename) { ?>
<li>I found a file: <?= $filename ?></li>
<?php } ?>
</ul>
scandir includes current directory (".") and parent ("..") in the array
basename with scandir; returns file names only (without directory name)
# reverse a file
$text = file_get_contents("poem.txt");
$text = strrev($text);
file_put_contents("poem.txt", $text);
file_get_contents returns entire contents of a file as a string
file_put_contents writes a string into a file, replacing its old contents
# add a line to a file
$new_text = "P.S. ILY, GTG TTYL!~";
file_put_contents("poem.txt", $new_text, FILE_APPEND);
| old contents | new contents |
|---|---|
Roses are red, Violets are blue. All my base, Are belong to you. |
Roses are red, Violets are blue. All my base, Are belong to you. P.S. ILY, GTG TTYL!~ |
file_put_contents can be called with an optional third parameter to append (add to the end) rather than overwrite *See http://en.wikipedia.org/wiki/All_your_base_are_belong_to_us
and http://www.zazzle.com/all_my_base_are_belong_to_you_valentines_day_tees-235673828263506759
URL?name=value&name=value...
http://www.google.com/search?q=Constitution http://example.com/student_login.php?username=claude&id=1234
username has value claude, and id has value 1234$_GET
$user_name = $_GET["username"];
$id_number = (int) $_GET["id"];
$eats_meat = FALSE;
if (isset($_GET["meat"])) {
$eats_meat = TRUE;
}
$_GET["parameter name"] returns an HTTP GET parameter's value as a string
http://....?name=value&name=value are GET parametersisset$base = $_GET["base"]; $exp = $_GET["exponent"]; $result = pow($base, $exp); print "$base ^ $exp = $result";
exponent.php?base=3&exponent=4
<?php foreach ($_GET as $param => $value) { ?>
<p>Parameter <?= $param ?> has value <?= $value ?></p>
<?php } ?>
print_params.php?name=Claude+Anderson&sid=1234567
Parameter name has value Claude Anderson
Parameter sid has value 1234567
or (for debugging) call print_r or var_dump on $_GET
Let's do an exercise together:
Add a parameter to Pascal's Triangle program: value of n for the last row.
Write PHP code to produce output like the following. Below, I show the beginning and end of the page it produces. My entire well-formatted PHP file is 35 lines long. I strongly recommend that you do pair programming with your partner.
Write PHP code that recursively traverses a folder and all its subfolders, counting the number of files of a specic type (both the root folder and the type can be constants in your program)
Below I show some of my PHP code, all but the function body(mine is 11 lines long).
Feel free to use this code or not.
glob is useful; print and print_r can help with debuging.
I strongly recommend that you do pair programming with your partner