PHP 陣列與字串

PHP 網站程式設計與資料庫基礎班 DAY 4

講師:張凱迪(KD.Chang)

Copyright © 2014 All rights reserved

Outline

Recap

Array

String

Recap

複習一下,

到現在我們已經學了不少東西!

Recap

Recap

如何架設簡單伺服器

明白流程控制是控制程式執行順序中重要的一環

了解變數、資料型態、運算子的使用方式

大致清楚函數和模組程式設計的概念

會做簡單的錯誤處理

前面幾章都是在打好基礎,為接下來的應用做好準備!

Array

Array 陣列基礎

Array 陣列是一種程式語言的基本資料結構,使用的頻率非常的高。在介紹變數時我們將變數比喻成存放值的箱子,這邊我們則把陣列比喻成公寓一排排的信箱(透過房號keys對應不同的信箱內容,也就是值values)。在 PHP 中除了提供索引陣列,也提供開發者可以自定鍵值的結合陣列

Indexed Array 索引陣列

索引陣列是由依序增加的正整數對應相對應的值,請注意鍵值預設是從 0 開始,不是從 1 開始!簡單來說,索引陣列勢將相同的資料型態的變數集合起來,使用一個名稱當做代表,然後使用索引值存取變數值

0

2

1

3

4

5

長度 6

$myArray[]

元素(索引 3)

17

索引

(結尾是長度 - 1)

Associative Array 結合陣列

結合陣列的鍵值是開發者自定的值,可以是正整數或是字串,每一個鍵值會對應到一個陣列值,鍵值不能重複,但對應值是可以重複的!

Amy

Tom

長度 3

$grades[]

元素(索引 Leo)

90

索引

 

Leo

77

53

一維索引陣列基礎

一維索引陣列是最基本的陣列結構,只有一個索引值,如同一層樓的信箱一樣,依序對應房號,注意陣列使用 print_r() 列印出所有陣列

<?php
//建立索引陣列,從 0 開始
$names[] = '小聾女';
$names[] = '任瑩瑩';
$names[] = '黃茸';
print_r($names);
// 存取與走訪陣列
echo $names[1];
for($i = 0; $i < count($names); $i++){
    echo $names[$i];
}
// 新增陣列元素
$names[3] = '王羽醃'; 
$names[] = '趙皿';
print_r($names);
?>

一維索引陣列基礎

陣列運算子

PHP 陣列變數支援指定敘述,可以直接將陣列變數指定成其他陣列變數,亦可以透過運算子的使用執行運算式。常用運算子如下:

 

1. + 聯集運算,取得第一運算元的所有元素,再加上第2個運算元陣列索引不存在第一個陣列元素

2. == 比較兩個陣列是否相等,相等傳回 true

3. === 比較兩個陣列元素是否相等,順序也須相同

4. != 比較元素是否不相等,不相等回傳 true

5. <> 比較元素是否不相等,不相等回傳 true

6. !== 比較元素是否不相等,順序也不相同

<?php
// 陣列運算子
$a = [1, 3, 5];
$b = [1, 3, 6, 9, 11];
$c = [1, 2, 4, 7, 11];
print_r($c);
$c = $a;
print_r($c);
print_r($a + $b);
?>

陣列運算子

陣列參數

在 PHP 中參數如果是陣列,預設使用傳值呼叫,亦可以使用傳址呼叫更改原陣列

<?php
$a = [1, 3, 5, 7];
function byValue($a) {
    $a[0] = 11;
}
byValue($a);
print_r($a);
function byRef(&$a) {
    $a[0] = 11;
}
byRef($a);
print_r($a);
?>

二維陣列基礎

二維陣列是擁有 2 個索引的陣列,是一維陣列的補充,如果將一維陣列想像成一度空間的線,二維就是一個二維平面

長度 6 * 2

$myArray[1][]

元素(索引 1, 4)

$myArray[0][]

3

二維陣列基礎

<?php
$myRow_0 = array(1, 3);
$myRow_1 = array(5, 7);
$myRow_2 = array(9,11);
$myArray = array($myRow_0, $myRow_1, $myRow_2);
print_r($myArray);
echo $myArray[0][1];
?>

結合陣列基礎

結合陣列是指陣列元素儲存的是對應的鍵值和值,其中鍵值不可以重複(可以是字串或是正整數),值可以重複

<?php
// 建立結合陣列
$grades['Tom'] = 93;
$grades['Leo'] = 77;
$grades[] = 89; // 沒鍵值預設為 0
$myArray = array('天氣'=>'晴天', '降雨機率'=>'30%');
print_r($grades);
print_r($myArray);
// 新增與刪除結合陣列
array_key_exists(0, $grades);
unset($grades['0']);
print_r($grades);
// 從 index 1 開始索引陣列(正整數鍵值的結合陣列)
$weeks = array('1'=>'週一', '2' => '週二');
print_r($weeks);
?>

結合陣列基礎

結合陣列相關函數

PHP 陣列函數可以使用內部陣列指標,走訪陣列和提供函數結合陣列拆成鍵值和對應值的陣列:

1. array_keys(array) 傳回參數結合陣列中的鍵值的陣列

2. array_values(array) 傳回參數結合陣列中的值的陣列

3. reset(array) 將內部陣列指標指到第一個

4. current(array) 傳回參數陣列目前指標指到元素值

5. key(array) 傳回參數陣列指標目前指到的鍵值

6. next(array) 指標往下一個元素

7. end(array) 指標移到最後元素

8. pre(array) 指標移到前一個元素

 

函數不定長度參數列

PHP 函數支援不定長度參數列,亦即函數的參數列不用指明資料型態和變數名稱,而是在函數中使用 PHP 函數取得傳入參數值

1. func_num_args() 取得傳入的參數個數

2. func_get_args() 取得傳入參數的陣列

3. func_get_arg(index) 取得參數 index 的第幾個參數值

 

 

 

<?php
function area() {
    return func_get_args()[0] * func_get_args()[1];
}
echo area(10, 17);
?>

使用 foreach 迴圈走訪陣列

PHP 可以透過 foreach  迴圈走訪陣列。as 前是欲走訪陣列,後則是指定給的元素值或是鍵值和元素值

 

 

 

<?php
$grades['Tom'] = 97;
$grades['May'] = 77;
$grades['Ben'] = 60;

foreach($grades as $element) {
    echo $element;
    echo '<br>'; 
}
foreach($grades as $key => $value) {
    echo $key . ' : ' . $value;
    echo '<br>';
}
?>
<?php
// each(array) 傳回參數陣列目前的鍵值和值陣列,並移到下一個元素,
// 結合 list()、each函數可以產生 foreach 效果,是過去常用的方法
while(list($k, $v)=each($grades)) {
    echo $k . ' : ' . $v;
    echo '<br>';
}
?>

使用 foreach 迴圈走訪陣列

陣列搜尋與排序

排序(sorting)和搜尋(searching)主要是要處理大量資料時最常用的資料處理方式,目標是讓處理資料更有效率

 

1. 排序基礎:主要是依照特定原則將陣列內容排列成遞增或遞減或是特殊的排列方式

 

2. 搜尋基礎:搜尋主要是在資料中找尋符合的資料,可能依照鍵值或是內容值進行搜尋,可分為已排序和未排序資料

(1) 針對沒有排序資料通常需要從頭開始確認

(2) 已排序資料可以不用從頭開始,可以依照排序規則搜尋

陣列搜尋與排序函數

PHP 提供陣列排序與搜尋函數,可以排序索引或結合陣列元素,並在陣列中搜尋指定元素資料:

1. sort(array, [,int]) 將參數索引陣列元素從小到大排

2. rsort(array, [,int])  類似 sort,從大到小

3. asort(array, [,int]) 將參數結合陣列的值從小到大排序

4. arsort(array, [,int]) 類似 asort ,從大到小

5. ksort(array, [,int])  將參數結合陣列鍵值從小到大排序

6. krsort(array, [,int])  如同 ksort(),只是改為從大到小

7. in_array(value, $array, [, bool]) 檢查第一個參數直視否在第二參數陣列中,找到回傳 true,反之 false

8. array_search(value, $array, [, bool]) 找到回傳元素鍵值

 

陣列搜尋與排序函數

<?php
$num = [4, 11, 6, 3, 5, 1];
$grades['Tom'] = 90;
$grades['Leo'] = 76;
$grades['Ben'] = 99;
sort($num);
print_r($num);
rsort($num);
print_r($num);
asort($grades);
print_r($grades);
arsort($grades);
print_r($grades);
ksort($grades);
print_r($grades);
krsort($grades);
print_r($grades);
echo in_array(90, $grades);
echo array_search(90, $grades);
?>

練習 3-1-1

請將以下表格轉換成二維陣列,列的鍵值為姓名,並於建完陣列後新增一人 Victor 成績為 59, 80

                 

Tom          90        75

Ben           77        85

KD             93        91

Hedger     88        97

練習 3-1-2

運用選單勾選框在後台 checkbox.php 中印出使用者的選擇

Hint : $_GET['man']  接收前端傳來資料的陣列,使用 foreach 走訪每個陣列元素

 

<form action="checkbox.php" method="get">
    <input type="checkbox" name="man[]" value="a">張飛
    <input type="checkbox" name="man[]" value="b">趙雲 
    <input type="checkbox" name="man[]" value="c">關羽 
    <input type="submit">
</form>

String

字串處理

PHP 中字串是一序列的字元集合,可以是用單引號或雙引號括起文字的內容,若想顯示變數值於字串中請用雙引號

<?php
$poet_name = "木蘭詩";
$my_string_1 = '$poet_name 東市買駿馬,西市買鞍韉';
$my_string_2 = "$poet_name 磨刀霍霍向豬羊";
echo $my_string_1;
echo '<br>';
echo $my_string_2;
?>

字串長度、大小寫處理

<?php
$my_string = 'PHP is awesome';
echo strlen($my_string); // 計算字串長度,有幾個字元,空白算一個
echo strtolower($my_string); // 英文轉小寫
echo strtoupper($my_string); // 英文轉大寫
echo trim($my_string); // 去除空白
?>

子字串處理、字元搜尋

<?php
$my_string = 'PHP is awesome';
// 傳回第二參數在第一參數第一次搜尋到位置
echo strpos($my_string, 'is'); 
// 同上,但從反向搜尋
echo strrpos($my_string, 'is'); 
// 傳回第二參數在第一參數搜尋到位置到最後的字串
echo strstr($my_string, 'is'); 
// 同上,不區分大小寫
echo stristr($my_string, 'is'); 
?>

子字串處理、字元處理

<?php
$my_string = 'PHP is awesome';
$my_array = array('hi', 'Web');
echo substr($my_string, 0, 3); // 從 index 0 取出長度 3 子字元
echo substr_count($my_string, 'PHP'); // 取出子字元數量
echo substr_replace($my_string, 'PHP QQ', 0); // 從 0 開始替代
echo strrev($my_string); // 反轉字串
echo str_repeat($my_string, 2); // 重複字串
print_r(explode(' ', $my_string)); // 將字串變成陣列
echo implode('.', $my_array); // 陣列串成字串
?>

字串比較

字串比較是比較一個個字元的內碼值,直到分出大小

 

1. strcmp() 比較兩參數字串內容,若相等傳 0,< 0 表第二個參數較大

2. strncmp(string, string, int) 只比較兩字串前 int 個字元

3. strcasecmp(string, string) 忽略英文字母大小寫,比較兩字串內容

4. strncasecmp(string, string, int) 忽略英文字母大小寫,比較兩字串前 int 個字元

Web 開發用字串函數

<?php
$my_string = '<h1>PHP \is "awesome"</h1>';
echo addslashes($my_string); // 為跳脫字元加上反斜線
echo stripslashes($my_string); // 刪除反斜線
echo htmlentities($my_string); // 轉成 HTML 字元集
echo nl2br($my_string); // 將參數字串中'\n' 換成 <br>
echo strip_tags($my_string) // 刪除HTML TAG
?>

練習 3-2

將 I want to make a website 利用字串函數取代 want 變成 love,然後利用 explode 和分割字元 " " 將字串轉換成陣列

Q & A

PHP 陣列與字串

By 張凱迪(KD Chang)

PHP 陣列與字串

本課程分為 前端網頁程式設計基礎班 和 PHP 網站程式設計與資料庫基礎班 兩個班,希望藉由這次課程能讓對於網頁程式設計有興趣的同學可以有一個入門的管道,在上完課程後可以有足夠的自學能力能夠持續學習進修,進而將自己的點子付諸實踐。課程網站:http://kdchang.cc/web-programming-course/ Email:web.programming.course@gmail.com FB 粉絲專頁:https://fb.com/Web.Programming.Course

  • 2,103