作者joehuang92 (乔乔)
看板b95902HW
标题 PHP一些小教学(阵列、字串、函式)
时间Sun Jan 7 21:46:24 2007
<阵列>
正如之前所说,PHP的一切都很类似於C,阵列也不例外。
PHP的阵列概念跟C完全相同,也同样是用数值当索引来存取阵列内容,也是以0做起点。
不过,之前也学到PHP是不宣告变数。在以前,C要宣告阵列都是:
int a[3]={1,2,3};
在PHP中,因为没有宣告的动作,可以用两种方式来完成这样的动作:
$a[0]=1;
$a[1]=2;
$a[2]=3;
或是
$a = array(1,2,3);
前面的做法很直观不需要解释,注意的是後方。
在後面的作法中,$a是一个阵列变数,这一个变数就代表了整个变数(类似於C的指标说法)
。我们只要在後方加上数字索引,就可以轻松的存取和控制$a变数中的小变数了。
PHP另外支援另一种"关联式阵列",也就是不需要用数字当作索引的阵列:
$a = array( 'first'=>1 , 'second'=>2 , 'third'=>3 );
这样就可以把索引设定成文字了,这样一来,$a['first']就等於1。
这样的写法或许有人会想起当时接收表单的语法:
$num = $_POST['num'];
现在就可以对这个语法作阵列的解释:在一个表单将资料送到php的网页里的时候,事
实上就是在php中建立了$_POST这个关联式阵列,其索引值为表单中的name属性,所以在
存取的时候就是以索引值来呼叫$_POST阵列的内容。
PHP对阵列有很多好用的运算子,分述如下:
+ 联集 $a + $b 把$b的内容附加到$a的後方
== 相等 $a == $b 若$a和$b含有相同变数时为true
=== 全等 $a === $b 若$a和$b含有相同变数,且索引值都相同时为true
!= 不等 $a != $b 若$a和$b含不同元素时为true
<> 不等 $a <> $b 同!=
!== 不全等 $a !== $b 若$a和$b含有相同变数,但索引值不同时为true
当然,PHP同样支援多维阵列,要在多维阵列放入值,语法如下:
$a = array( array(1,2,3) ,
array(4,5,6) ,
array(7,8,9) );
这样的话,$a[1][2]=2 $a[3][3]=9。
PHP关於阵列的好用函式还有很多,其中最重要的应该是排序函式:
sort($a)
这样,就会把$a阵列的内容按照小到大排列。
例如,若$a = array( 3,2,1 );
sort($a)之後,$a[0]=1 $a[1]=2 $a[2]=3。
针对於关联式阵列,则可以使用
asort与
ksort函式。
其中,asort会按照值排列,ksort则会以索引的字串来排列。
如果要从大到小排列,我们只需再sort前加r,分别形成rsort(),arsort(),krsort()三个
新的函式。不过,这些函式全部都只能对1维的阵列作用就是了。
另外也可以用
shuffle函式对阵列任意排序,以达到"广告"的效果(有些网站每次进去都
会显示不同的产品)。
有了这些基本的知识,现在来实作一个简单的留言板:
假设在存入资料的时候,我们把内容存成这样的文件:
(text.txt内容)
2007/1/7
\tjoehuang90
\thello
\n
2007/1/7
\tjack993
\tyeah!
\n
2007/1/8
\thenry2007
\tmessage
\n
这份文件储存使用者输入的资讯,用\t(tab键)分隔,每笔资料则以换行字元\n分隔。
我们在这里使用之前的file函式取出这些值,注意file函式会把整个档案一次取出,并以
换行字元作分隔,把分割的每个资料变成阵列的元素。
於是:
$data = file("text.txt");
这时候:
$data[0] = "2007/1/7\tjoehuang90\thello\n"
$data[1] = "2007/1/7\tjack993\tyeah!\n"
$data[2] = "2007/1/8\thenry2007\tmessage\n"
为了要印出所有的内容,我们希望用for回圈来做,所以会需要用到资料数,在这里我们
使用count函式:
$num_data = count($data);
此时,$num_data = 3。
最後我们写入这样的程式:
<?
echo "<table border=1>";
for( $i=0 ; $i<$num_data ; $i++ )
{
$line = explode("\t",$data[$i]);
echo "<tr>";
echo "<td>" . $line[0] . "</td>";
echo "<td>" . $line[1] . "</td>";
echo "<td>" . $line[2] . "</td>";
echo "</tr>";
}
echo "</table>";
?>
这段程式中,我们用echo输出了一个表格,其中每一行都用一个for回圈来写。
注意的是其中的explode函式,它会将第二个引数的字串以第一个引数的字元作分隔,并
将其变成字串阵列回传。所以当第一次回圈执行时,这行程式码是:
$line = explode("\t",$data[0]);
而此时的$data[0]则是
$data[0] = "2007/1/7\tjoehuang90\thello\n"
经过explode函式处里之後,$data[0]被分成
"2007/1/7"
"joehuang90"
"hello"
这三个值会形成一个阵列并丢到$line变数,所以此时
$line[0]="2007/1/7"
$line[1]="joehuang90"
$line[2]="hello"
然後经由上面的程式印出在表格内。
因此,一个简易的留言板可以写成:
(board.php)
<html>
<head></head>
<body>
<?
$data = file("text.txt");
$num_data = count($data);
if( $num_data=0 )
echo "No content is written.";
echo "<table border=1>";
for( $i=0 ; $i<$num_data ; $i++ )
{
$line = explode("\t",$data[$i]);
echo "<tr>";
echo "<td>" . $line[0] . "</td>";
echo "<td>" . $line[1] . "</td>";
echo "<td>" . $line[2] . "</td>";
echo "</tr>";
}
echo "</table>";
?>
</body>
</html>
如果到目前都没有问题,这份程式码应该不会太难。
<字串>
PHP通常最常处里的资讯是字串,所以熟悉字串的一些操作是很重要的。
在C中,字串通常以" "双引号表示,而字元则以' '单引号表示。PHP中,因为没有字元
和字串的分别,通常" "跟' '都可以表示字串。
以下列出一些字串的常用函式:
trim() ltrim() rtrim() 去除空白
这三个函式可以分别去除一字串起始或结尾的空白,trim同时去除头尾的空白,ltrim
则去除起始的空白,rtrim则去除结尾的空白。
nl2br() 将字串中的\n改成<br>
这个函式会将字串中所有换行字元改显示为<br>并直接输出,所以等於是echo的加强版。
只要把字串放到这个函式,就等於会把它直接输出成html。
printf() 格式化输出
用法跟C完全相同。
strtoupper() strtolower() 字串改大写/改小写
字串的内容全部以大写字母/小写字母显示。
explode(string seperator,string input) 分割字串
将字串以第一个引数为分隔字元,将第二个引数做分割,并传回分割後的字串阵列。
implode(string seperator,string array) 合并字串
跟explode相反,这个函式把第二个引数的字串阵列用分隔字元来组回一个完整的字串。
substr(string input,int start,int length) 取出子字串
这个函式可以从第二个引数的数字开始,取第三个引数长度的子字串。例如:
$str = substr("Merry Christmas",2,5);
会传回"rry C"。
strcmp() 比较字串
同C的strcmp。
strlen() 求字串长度
同C的strlen。
strstr(string input,string target) 搜寻字串
同C的strstr,这个函式在第一个引数的字串中搜寻第二个引数的字串,如果成功的话则
传回找到位置以後的字串,否则传回false。例如:
$str = strstr("Happy birthday","birth");
会回传"day"。
str_replace(string old,string new,string input) 取代子字串
这个函式会把第三个引数的字串中,所有包含第一个引数字串的部份替换成第二个引
数的字串,并回传更改的字串。譬如:
$str = str_replace("the","The","the weather is fine");
会回传"The weather is fine"。
<函式>
与C相同,PHP支援在程式码中自建函式,也可以从外部include进函式。
不过,因为PHP通常都不指定型别,所以在PHP中的函式也不用指定型别。要宣告一个函
式的做法如下:
function my_function()
{
}
内容的宣告法完全相同,如果要把函式写在程式的下方也一样得在程式开头写入原型。
如果要在函式中传递指标,则必须在参数前加上&,譬如:
function my(&$value)
PHP中,如果想要从外部来引入函式,只需要把函式写在某个txt之类的文件档,然後引
入就可以用了,不需要使用到标头档之类的东西。引入的方式有两种:
require()跟
include()。
使用方法很简单,就是require("text.txt"),然後该档案的内容就会完全被写到php里,
取代掉该行文字。
require跟include用法相同,两者只差在require函式读档错误时会是严重错误,而inclu
de会是一般错误。
一般来说,这两个函式的用处不只是引入函式库。另一种用法是当网页中有些区块必须反
覆的出现,譬如说选单。则我们可以把输出选单的php程式写在txt里面,然後在每个网
页中用require将其引入。如此一来,不仅可以节省html码的空间,也可以在选单做更改时
,同步的更改所有的网页。
譬如说,当我们的网页有相同的一段页首与页尾,分别写在header.inc和footer.inc,那
使用了require之後,每个网页就只需要写成:
<? require("header.inc"); ?>
html的内容
<? require("footer.inc"); ?>
当我们需要更改页首根页尾的内容的时候,所有的网页就会自动的更新了。
----------------------------------------------------------
基本上PHP的说明就到这边,剩下的东西基本上与C大部分也都雷同,或是不常用。
唯一还没有讲的东西可能是PHP的SQL资料库操作,不过讲了会变的非常复杂,也不好讲解
,有兴趣的人可以自己查阅相关的资料。
如果目前的东西都学会了,相信应该已经有办法自己写出一个简单的留言版了,加油吧!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.14.228
1F:推 user02:这位强者时间很多..普物跟微积分大概都看完了 01/07 22:41
2F:→ sam9595:死台科 人家对大家好你还要酸人家 01/07 23:03
3F:推 ybite:$a = array( 'first'=>1 'second'=>2 'third'=>3 ); 01/07 23:17
4F:→ ybite:是不是漏了逗号... = =": 01/07 23:17
5F:→ ybite:还有话说&$value那个东西应该叫"Reference" (总之随便啦 xD) 01/07 23:24
6F:推 springgod:好文 但是建议要先把C学好 短期内其它的语言看看就好 01/08 00:00
7F:推 sam9595:春神有所不知 这是作业呀 囧 超难的 没碰过跟本不知道HOW 01/08 00:19
8F:→ joehuang92:的确漏了囧,补齐先 01/08 01:49
※ 编辑: joehuang92 来自: 59.121.14.228 (01/08 01:49)
9F:→ scan33scan33:想必这位强者已经把C学的很好了XD 01/08 20:40