PHP字串長度找子字串與取代字串的常用函數

PHP在字串的操作上,有非常多的相關函數可以使用,我們在這裡只介紹經常會使用到的字串操作函數。像是如何取得字串的長度、在某一個字裏面尋找子字串首次出現的位置、以及字串的取代函數...等等。這些都是在編寫程式的時候,頻繁被程式設計師使用到的基礎函數。 取得字串長度 <?...

2018年2月16日 星期五

PHP字串長度找子字串與取代字串的常用函數

PHP在字串的操作上,有非常多的相關函數可以使用,我們在這裡只介紹經常會使用到的字串操作函數。像是如何取得字串的長度、在某一個字裏面尋找子字串首次出現的位置、以及字串的取代函數...等等。這些都是在編寫程式的時候,頻繁被程式設計師使用到的基礎函數。

取得字串長度
<?php
$str_len = strlen('abc');
echo '長度:'.$str_len;
?>
輸出結果:
長度:3

在某字串中,找出一個子字串第一次出現的位置
<?php
$str = 'abcdefg';
$str_pos = strpos($str, 'd');
echo '位置:'.$str_pos;
?>
輸出結果:
位置:3

在某字串中,找出一個子字串最後一次出現的位置
<?php
$str = 'abcdeDdfg';
$str_rpos = strrpos($str, 'd');
echo '位置:'.$str_rpos;
?>
輸出結果:
位置:6

找出一個不區分大小寫的子字串第一次出現的位置
<?php
$str = 'abDcdefg';
$str_ipos = stripos($str, 'd');
echo '位置:'.$str_ipos;
?>
輸出結果:
位置:2

找出一個不區分大小寫的子字串最後一次出現的位置
<?php
$str = 'abDcdefDg';
$str_ripos = strripos($str, 'd');
echo '位置:'.$str_ripos;
?>
輸出結果:
位置:7

字串取代
表示取代所有已找到的字串為新字串
<?php
$str = "abc中文def";
$new_str = str_replace('中文', '功夫', $str);
echo '新字串:'.$new_str;
?>
輸出結果:
新字串:abc功夫def

字串取代 (不區分大小寫)
<?php
$str = "abDcDdefd";
$new_str2 = str_ireplace('d', 'x', $str);
echo '新字串:'.$new_str2;
?>
輸出結果:
新字串:abxcxxefx


PHP字串去除空白與字串轉大小寫

PHP字串去除空白可以依編寫程式的需要來去除左右邊的空白,亦或是只去除左邊還是右邊的空白。也可以對字串進行完全大寫或小寫的轉換,或是在字串中對第一個字元轉大寫或小寫,如果你要將字串裡面的每一個字的的第一個字元都轉成大寫也是有對映的函數可以運用。

去除字串左右空白
<?php
$str = ' abc ';
echo trim($str);
?>
輸出結果:
abc

去除字串左邊空白
<?php
$str = ' abc ';
echo ltrim($str);
?>
輸出結果:
abc

去除字串右邊空白
<?php
$str = ' abc ';
echo rtrim($str);
?>
輸出結果:
 abc

字串轉小寫
<?php
$str = 'ABC';
echo strtolower($str);
?>
輸出結果:
abc

字串轉大寫
<?php
$str = 'abc';
echo strtoupper($str);
?>
輸出結果:
ABC

字串的字首大寫
<?php
$str = 'abc';
echo ucfirst($str);
?>
輸出結果:
Abc

字串的字首小寫
<?php
$str = 'ABC';
echo lcfirst($str);
?>
輸出結果:
aBC

字串中的每一個字的開頭字元大寫
<?php
$str = 'apple newsletter';
echo ucwords($str);
?>
輸出結果:
Apple Newsletter





PHP字串分割與組合函數

字串的分割、組合函數,在開發PHP的程式設計當中是經常運用的程式開發技巧,可以將一個字串切割成多段子字串,再儲存於陣列中。相反的,也可以將一個陣列內的元素,重新組合成為一個字串,亦或直接從CSV檔案中取出每一個資料元素合成一個新的陣列。

透過字串來分割字串
<?php
$arr1 = explode("|", "A|B|C");
print_r($arr1);
?>
輸出結果:
Array ( [0] => A [1] => B [2] => C )


組合陣列為一個字串
<?php
$arr1 = array('A','B','C');
$str1 = implode("|", $arr1);
echo $str1.'<br/>';

// 表示implode的別名
$str2 = join("|", $arr1);
echo $str2;
?>
輸出結果:
A|B|C
A|B|C


剖析CSV檔案格式為一個陣列
<?php
$csv_str = "a,b,c,d,e";
$arr2 = str_getcsv($csv_str);
print_r($arr2);
?>
輸出結果:
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )


轉換一個字串為一個陣列
<?php
// 依3個字元長度進行字串切割
$str3 = "abcdef";
$arr3 = str_split($str3,3);
print_r($arr3);
?>
輸出結果:
Array ( [0] => abc [1] => def )


剖析字串為變數
主要是將PHP網頁請求的$_GET或$_POST方法所傳入的Query String的網頁傳遞的編碼參數進行格式化的陣列轉換。
<?php
// 表單請求的Query String
$str4 = "user=monkey&phone=7533967";
$arr4 = parse_str($str4, $result);
print_r($result);
?>
輸出結果:
Array ( [user] => monkey [phone] => 7533967 )




2018年2月13日 星期二

PHP自定函數的使用

PHP的自定函數的名稱,可以是英文字數、數字、或底線的字元組合而成,前綴字必須是function為開頭,中間為函數名稱,括孤內為要傳遞的參數,傳遞參數的方式可以分為傳值呼叫(Call by value)或傳址呼叫(Call by reference),一般我們常見到的函數使用都是傳值呼叫的方式。接下來我們就來自定義一下我們的第一支PHP函數:

第一支PHP自定函數 (或傳值呼叫函數)
以下的範例是一個簡單與典型的傳值呼叫方式的自定義函數。在呼叫該函數時會傳入$user這個全域性變數,然而$user這個字串變數值不會因為執行該函數後,產生任何的改變。這個就是傳值呼叫函數的重要特徵。
<?php
// 我的自定函數 (傳值函數)
function my_function($name) {
  echo $name."歡迎光臨!<br/>";
  $user = "大毛";
}

// 呼叫自定函數
$user = "小明";
my_function($user);
echo $user;
?>
輸出畫面:
小明歡迎光臨!
小明


傳址呼叫函數
何謂傳址呼叫函數? 故明思義,就是傳遞參數的記憶體的參考位置給自定函數使用的意思,如果還是以上面的例子來改寫說明如下,請仔細注意my_function函數的$name參數左邊多了一個&字母,表示當再次呼叫該自定函數後,$user這個全域性字串變數值會因為執行而結果產生變化。

<?php
// 我的自定函數 (傳址函數)
function my_function(&$name) {
  echo $name."歡迎光臨!<br/>";
  $name = "大毛";
}

// 呼叫自定函數
$user = "小明";
my_function($user);
echo $user;
?>
輸出畫面:
小明歡迎光臨!
大毛



2018年1月14日 星期日

PHP日期Date的常用函數

在PHP的程式語言裡,早期就是採用Date函數來處理日期的產生、格式化以及字串轉換成日期型態。
  1. 可以利用time()或mktime()獲得當前的時間戳記
  2. 或者使用date()來針對特定日期進行格式化
  3. 若要把字串轉換成為日期就要透過strtotime()函數
以下為簡單的指令操作範例:
<?php
// 取得目前時間的timestamp
$now = time();
$now2 = mktime();

// 對現在的日期進行格式化
echo date("Y-m-d H:i:s", $now);

// 將字串轉換成日期
echo strtotime("2018-01-02");
?>

如果要採行新的作法,也可以考慮改用DateTime日期類別,PHP 5.2.x版本以後開始支援。

PHP日期DateTime的常用函數

從PHP 5.2.x開始以後, 我們可以使用DateTime類別來產生某特定日期、日期格式化與日期的加減操作, 過去習慣利用Date函數來幫我們完成這些任務。

產生今天的日期函數

<?php
// 取得目前時間的timestamp
$now = time();
$now2 = mktime();
?>

透過DateTime產生日期和日期格式化

<?php
// 建立DateTime型別的日期
//$date = DateTime("2018-01-02");
$date = date_create("2018-01-02");

// 針對DateTime型別的日期進行格式化
$date_ft = date_format($date,"Y-m-d");
echo $date_ft;
?>

運用DateTime進行日期加、減運算

<?php
// 某特定日期增加6天
$date_m6 = date_modify($date,"+6 days");
// 某特定日期減少3天
$date_m3 = date_modify($date,"-3 days");
?>
我們在透過DateTime進行日期、時間的算術運算操作時,若要將剛才生成的DateTime實體物件打印出來可以使用print_r($date_m3)來觀察該物件內存放了那些資料,要不然必須先把日期物件格式化為字串,才能順利輸出到電腦螢幕畫面上顯示。

PHP常用輸出指令

在PHP程式語言的世界裡,若要將程式執行的結果輸出到電腦螢幕上,就需要以下6個經常使用的輸出資料串流的指令。由於這些指令除了可以讓我們除錯程式碼,也可以讓我們預覽準備要傳送到列表機列印的欄位、資料、格式正確與否。

  • echo  輸出一個字串或多個字串
  • print  輸出一個字串
  • print_r  列印一個陣列
  • var_dump  輸出一個變數的相關資訊
  • die  輸出結果並且終止程式
  • exit 當參數為0時,等同die的作用

使用範例說明:

<?php
// 輸出字串
echo "你好嗎?";
print "I am fine.";

// 輸出陣列
print_r(array('apple','android'));

// 輸出變數型別、長度等明細資訊
$str = "開心果";
var_dump($str);

// 輸出變數且終止程式
$str2 = "Happy Birthday";
die($str2);

// 也可以使用exit(0)終止程式
echo $str2;
exit(0);
?>

PHP輸出格式化字串

想要讓字串可以進行格式化的編排、組合,並且能夠傳回字串變數、輸出到螢幕或輸出到文字檔案裏面。
一定要記得使用以下4種格式化字串的指令操作方式:

  • printf  輸出格式化的字串
  • sprintf  回傳格式化的字串
  • sscanf  將字串輸入格式化,回傳對映的變數
  • fprintf  將格式化字串寫入文字檔案

使用範例說明:

<?php
// 列印格式化的字串到電腦螢幕上
$name = "小明";
$number = 6;
$dollar = 177.6;
printf("%s有%d張一塊美鈔,折合新台幣%f元", $name, $number, $dollar);

// 組合格式化的字串
$combine_str = sprintf("%s有%d張一塊美鈔,折合新台幣%f元", $name, $number, $dollar);
echo $combine_str;

// 棓析格式化字串為相映數位
$today = "2017-01-14";
list($year, $month, $day) = sscanf($today, "%d-%d-%d");
echo $year. $month. $day;

// 將19.88寫入balance.txt檔案內
$fp = fopen('balance.txt', 'w');
$revenue = 19.8756;
fprintf($fp, '%01.2f', $revenue);
?>

2018年1月6日 星期六

MySQL資料型態與JAVA資料型態的轉換

若要將MySQL data type轉換成Java data type可以參考如下的表格:

MySQL資料型別 可被轉換的JAVA資料型別
CHAR, VARCHAR, BLOB, TEXT, ENUM, ,SE java.lang.String, java.io.InputStream, java.io.Reader, java.sql.Blob, java.sql.Clob
FLOAT, REAL, DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINT java.lang.String, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Double, java.math.BigDecimal
DATE, TIME, DATETIME, TIMESTAMP java.lang.String, java.sql.Date, java.sql.Timestamp



參考連結:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-type-conversions.html

PHP的JSON編碼使用

JSON(JavaScript Object Notation)它是一種羽量級的資料交換語言,類似於XML的易於人類閱讀與使用,屬於Javascript的一個子集合,JSON的資料格式獨立於語言,目前被很多程式語言(PHP,ASP,JAVA,C...等等)所支援的資料交換格式。JSON的MIME 類型是application/json。

事前的準備工作:
  1. 建立一個$arr陣列物件
  2. 使用json_encode函數,把$arr陣列編碼成$json字串
  3. 再運用json_decode函數,把$json字品解碼回$arr_new陣列
首先,我們來使用PHP Array創建一個$arr的關連一維陣列,
<?php
// 建立$arr陣列
$arr = array("name"=>"Monkey boy", "tel"=>3829389);
?>

然後,以json_encode函數,把剛才建好的$arr陣列物件編碼成$json字串
<?php
// JSON編碼
$json = json_encode($arr);
?>

最後,透過json_decode函數,把$json字串解碼回$arr_new陣列物件
<?php
// JSON解碼
$arr_new = json_decode($json);
echo $arr_new;
?>

PHP陣列Array的使用

PHP語言當中,陣列是一種很常使用的資料型態,通常用來儲存一組資料或資料的集合。一般分為三種類型的陣列:
  1. 索引陣列
  2. 關聯陣列
  3.  多維陣列
索引陣列(或稱一維陣列)
<?php
// 建立一個$fruit陣列存放三個元素到陣列中
$fruit = array("香蕉","西瓜","蘋果");
echo $fruit[0];
?>

關聯陣列
它是由多組的鍵/值所組合而成的資料集合。
<?php
// 建立一個$member陣列存放二個元素到陣列中
$member = array("name"=>"Jerry","tel"=>"3924350");
echo $member["name"];
?>

多維陣列
顧名思義列陣裡面還有陣列的意思。我們就簡單實作一個二層次的两維陣列,如下所示。
<?php
// 產生一個$order两維陣列存放二個訂單明細陣列
$order = array(

           "order_id"=>"order0001",

           "total_amount"=>998,

           "detail0001"=>array("goods_name"=>"白上衣","price"=>299),

           "detail0002"=>array("goods_name"=>"牛仔褲","price"=>699),

          );

echo $order[detail0001]["goods_name"];
?>

陣列的基本操作
<?php
// 計算陣列的長度
echo count($order);

// 利用foreach讀取陣列元素
foreach($order as $key=>$value) {
    echo $value["order_id"];
    echo $value["total_amount"];
}

// 判斷'西瓜'元素是否在$fruit陣列中
if(in_array("西瓜", $fruit)) {
    echo "答對了!"
} else {
    echo "答錯了!"
}

// 將陣列內的元素重新賦於新的變數
list($banana,$watermelon,$apple) = $fruit;
echo $banana;
?>

2018年1月2日 星期二

PHP的序列化Serialize使用

首先,我們需要建立一個User的類別,便於後續物件序列化與反序列化的作業,

<?php
class User {
  private $name;
  private $pass;
  
  function __construct($name, $pass) {
      $this->name = $name;
      $this->pass = $pass;
  }

  public function getName() {
      return $this->name;
  }
  
  public function setName($name) {
      $this->name = $name;
  }

  public function getPass() {
      return $this->pass;
  }
  
  public function setPass($pass) {
      $this->pass = $pass;
  }
}
?>

以它來實體化一個新的$user物件,
<?php
$user = new User("Jerry", "adioirq386hsakhd");
echo $user->getName();
?>

然後我們使用serialize函數將$user物件序列化為字串,
<?php
//物件的序列化
$user_str = = serialize($user);
?>

最後可以利用unserialize函數把$user_str字串反序列化為$obj物件。
<?php
//物件的反序列化
$obj = unserialize($user_str);
?>

2017年12月25日 星期一

PHP使用$_SERVER取得主機IP與網址

<?php
// 取得server ip
echo $_SERVER['SERVER_ADDR'];

// 取得目前請求的PHP頁面的完整URI
echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
echo $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

// 取得目前請求的PHP頁面的完整實體路徑
echo $_SERVER['SCRIPT_FILENAME'];

// 取得網站的根目錄
echo $_SERVER['DOCUMENT_ROOT'];

// 取得目前請求的PHP頁面的相對URI
echo $_SERVER['REQUEST_URI'];
echo $_SERVER['SCRIPT_NAME'];
echo $_SERVER['PHP_SELF'];
?>

PHP取得隨機時間的函數

<?php
// 取得隨機時間的函數
function get_rand_time($st_time, $ed_time)
{  
  $nums = ($ed_time - $st_time)/(24*60*60);
  //echo  '1 ~ ' . $nums . '<br/>';

  $rd_num = rand(1,$nums);
  //$rand_time = $st_time + ($rd_num - 1) * 24*60*60;
  $rand_time = $st_time + ($rd_num - 1) * 24*60*60 + (rand(1,86399));
  if($rand_time > time()) $rand_time = time();
  //echo $rand_time . ' ('.$rd_num.') <br/>';
  //echo date("Y-m-d H:i:s", $rand_time);
  
  return date("Y-m-d H:i:s", $rand_time);
}

// 執行函式呼叫
$ed_time = strtotime(date("Y-m-d"));
$st_time = $ed_time - 30*24*60*60;

get_rand_time($st_time, $ed_time);

?>

PHP日期DATE指令的操作

<?php
// 取得現在時間時間戳記(Unix timestamp)
echo time();
echo mktime();

// 格式化時間
echo date('Y-m-d H:i:s', '1461827400');
echo date("Y-m-d H:i:s");

// 字串轉時間
echo strtotime("10:30pm April 15 2014");

// 設定timestamp
$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

// 設定預設的時區
date_default_timezone_set();

// 設定timezone和format
$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

?>

PHP與SimpleXml使用CRUD

<?php
// 建立SimpleXmlElement
$config = new SimpleXmlElement('');
$config->setting1 = 'setting1 value';         
$config->saveXML('config.xml');               

// 讀取SimpleXmlElement
$config = new SimpleXmlElement('config.xml');
echo $config->setting1;
echo $config->asXml();

// 更新SimpleXmlElement
$config->setting1 = 'new value';
$config->setting2 = 'setting2 value';
echo $config->asXml();

// 刪除SimpleXmlElement
unset($config->setting1);
$config->setting2 = NULL;
echo $config->asXML();
unlink('config.xml');

?>

PHP常用字串指令的使用

<?php
$str = "電腦專家,是PRO訓練,有素的人才!";

// 字串轉小寫
echo strtolower($str);

// 字串轉大寫
echo strtoupper($str);

// 從左邊開始找PRO字串片段
echo strpos($str,'PRO');

// 從右邊開始找PRO字串片段
echo strrpos($str,'PRO');

// 取長度為5的子字串
echo substr($str, 5);

// 字串取代
echo str_replace("PRO", "專業", $str);

// 字串分割為陣列
$ss = explode(',',$str);

?>

2017年12月24日 星期日

使用GridBagLayout將每個元件放入每一格子裡面

package test.swing.layout;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class TestGridLayout extends JFrame {
 
 private JPanel contentPane;

 public static void main(String[] args) {
  TestGridLayout frame = new TestGridLayout();
  frame.setVisible(true);
 }
 
 public TestGridLayout() {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setBounds(100, 100, 450, 300);   //(左邊界,上邊界,宽度,長度)
  contentPane = new JPanel();
  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));   //(上,左,下,右)
  setContentPane(contentPane);
  
  //將Layout設定為GridLayout會把視窗畫面切割成長、宽相同大小的方格
  contentPane.setLayout(new GridLayout(2, 0, 10, 5));  //(列數,欄數,左右間距,上下間距)
  
  JButton firstBtn = new JButton("按鈕 1");
  contentPane.add(firstBtn);
  
  JButton secondBtn = new JButton("按鈕 2");
  contentPane.add(secondBtn);
  
  JButton thirthBtn = new JButton("按鈕 3");
  contentPane.add(thirthBtn); 
  
  JButton forthBtn = new JButton("按鈕 4");
  contentPane.add(forthBtn); 
 }

}

執行結果

運用FlowLayout來依序排列元件,超出列宽往下一列放置元件


package test.swing.layout;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class TestFlowLayout extends JFrame {
	
	private JPanel contentPane;

	public static void main(String[] args) {
		TestFlowLayout frame = new TestFlowLayout();
		frame.setVisible(true);

	}
	
	public TestFlowLayout() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);   //(左邊界,上邊界,宽度,長度)
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));   //(上,左,下,右)
		setContentPane(contentPane);
		
		//將Layout設定為由左至右的排列components之間的關係,超出面板宽度的元件往下列遞補
		contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));   //(置左,左右間距,上下間距)
		
		JButton firstBtn = new JButton("按鈕 1");
		contentPane.add(firstBtn);
		
		JButton secondBtn = new JButton("按鈕 2");
		contentPane.add(secondBtn);
		
		JButton thirdBtn = new JButton("按鈕 3");
		contentPane.add(thirdBtn);
		
		JButton forthBtn = new JButton("按鈕 4");
		contentPane.add(forthBtn);
		
		JButton fifthBtn = new JButton("按鈕 5");
		contentPane.add(fifthBtn);
		
		JButton sixthBtn = new JButton("按鈕 6");
		contentPane.add(sixthBtn);		
	}

}

執行結果

使用GridLayout將元件放入每個相同大小的格子中


package test.swing.layout;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class TestGridLayout extends JFrame {
	
	private JPanel contentPane;

	public static void main(String[] args) {
		TestGridLayout frame = new TestGridLayout();
		frame.setVisible(true);
	}
	
	public TestGridLayout() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);   //(左邊界,上邊界,宽度,長度)
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));   //(上,左,下,右)
		setContentPane(contentPane);
		
		//將Layout設定為GridLayout會把視窗畫面切割成長、宽相同大小的方格
		contentPane.setLayout(new GridLayout(2, 0, 10, 5));  //(列數,欄數,左右間距,上下間距)
		
		JButton firstBtn = new JButton("按鈕 1");
		contentPane.add(firstBtn);
		
		JButton secondBtn = new JButton("按鈕 2");
		contentPane.add(secondBtn);
		
		JButton thirthBtn = new JButton("按鈕 3");
		contentPane.add(thirthBtn);	
		
		JButton forthBtn = new JButton("按鈕 4");
		contentPane.add(forthBtn);	
	}

}

執行結果