Skip to content

Zeroplex 生活隨筆

軟體開發和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

標籤: PHP

PHP array_merge() 在資料型別上行為的差異

Posted on 2014 年 11 月 25 日2021 年 3 月 12 日 By 日落 在〈PHP array_merge() 在資料型別上行為的差異〉中有 2 則留言

array_merge() 可合併多個陣列,遇到相同的陣列索引,將由後方陣列的值取代前一個值。

如:

$d = array(
  'a' => 111,
  'b' => 222,
);
 
$e = array(
  'a' => 123,
  'c' => 333,
);
var_dump(array_merge($d, $e));

執行結果為:

array(3) {
  ["a"]=>
  int(123)
  ["b"]=>
  int(222)
  ["c"]=>
  int(333)
}

此特性常被用來做設定選項合併,如:

function__construct(array $config){
  $defaultsStyle = array(
    'display' => true,
    'color' => 'red',
    'size' => '14px',
  );

  $settings = array_merge($defaultStyle, $config);

  // initialize by $settings
}

上面的寫法可以讓預設的三項索引「display」、「color」、「size」一定存在,不需特別在做 array_key_exists() 檢查,且外部傳入的數值,會將內定的預設值覆蓋掉。

不過只有字串型態的陣列索引,經過 array_merge() 以後可以保留原有的索引名稱,若為數字型態的陣列索引,array_merge() 會將原有索引打掉重新排列。

如:

$d = array(
  0 => 111,
  1 => 222,
);
 
$e = array(
  9 => 123,
  7 => 333,
);
var_dump(array_merge($d, $e));

執行的結果會是:

array(4) {
  [0]=>
  int(111)
  [1]=>
  int(222)
  [2]=>
  int(123)
  [3]=>
  int(333)
}

另外 array_merge() 有個很奇怪的行為,假設陣列的索引是「類似數字」的字串 (不曉得判斷規則為何),像是 “100”、”200″,經過 array_merge() 時會被當成數字型索引處理。

如:

$d = array(
  '100' => 111,
  '200' => 222,
);
 
$e = array(
  '100' => 100,
  '300' => 333,
);
var_dump(array_merge($d, $e));

執行後為:

array(4) {
  [0] =>
  int(111)
  [1] =>
  int(222)
  [2] =>
  int(100)
  [3] =>
  int(333)
}

若索引名稱為 “001”、”002″,經過 array_merge() 才會被當成字串,不會有上述情況發生。

要避免索引被吃掉,可以改用 array unioin operator:

$d = array(
  '100' => 111,
  '200' => 222,
);
 
$e = array(
  '100' => 100,
  '300' => 333,
);
var_dump($d + $e));

陣列索引會被保留下來:

array(3) {
  [100] =>
  int(111)
  [200] =>
  int(222)
  [300] =>
  int(333)
}

不過要注意的是,array union operator 遇到相同索引時,陣列值並不會被後方的陣列取代 ($merged[‘100’] 會是 111 而非 100),所以使用時要注意順序問題。

總之,’100’、’200′ 被 array_merge() 當成數字讓我極度不爽。

Tags:PHP

使用 ini_set() 設定 Xdebug function calls trace

Posted on 2014 年 1 月 14 日2021 年 3 月 12 日 By 日落 在〈使用 ini_set() 設定 Xdebug function calls trace〉中尚無留言

Xdebug 是一個在 PHP 上很好用的除錯工具,特別是 function calls tracing,可以很完整的列出執行流程。Xdebug 的介紹可以參考 Crboy 的文章:

  • Xdebug 基礎安裝與使用
  • Xdebug 遠端除錯 (Remote Debugging)

要讓 Xdebug 在 PHP 開始執行時自動 trace function calls,只需要在 ini file 加上 xdebug.auto_trace = On 即可。若沒有系統權限,仍可以使用 PHP 的 ini_set() 設定 Xdebug 各項參數:

<?php

ini_set('xdebug.trace_output_dir', '/tmp/xdebug');
xdebug_start_trace();  // start tracing

// beginning of program

要注意的是,tracing 的設定會在 PHP 開始執行前便載入,所以使用 ini_set() 設定 xdebug.auto_trace 是不會起作用的:

<php

ini_set('xdebug.auto_trace', 'On');  // 沒有作用
ini_set('xdebug.trace_output_dir', '/tmp/xdebug');

// beginning of program

ps. 若 auto trace 已啟動,要記得定期清理 log,免得硬碟被吃光導致機器故障。

Tags:PHP

PHP 復活節彩蛋

Posted on 2013 年 11 月 22 日2021 年 3 月 12 日 By 日落 在〈PHP 復活節彩蛋〉中尚無留言

應該不少人知道可以在網址後加上一段參數「?=PHPE9568F36-D428-11d2-A769-00AA001ACF42」,來顯示 PHP 復活節彩蛋,可以在 php.ini 中設定「expose_php = Off」將奇關閉。

這幾個參數顯示的資料,沒什麼大礙,倒是「expose_php = On」時,還會在 HTTP header 多加一個參數,顯示系統版本:

Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Fri, 22 Nov 2013 04:10:12 GMT
Transfer-Encoding:chunked
X-Powered-By:PHP/5.3.10-1ubuntu3.8

若覺得這對安全有影響的話,還是將 expose_php 改為 off 吧。

Tags:PHP

關於 PHP Short Tag

Posted on 2013 年 8 月 21 日2021 年 3 月 12 日 By 日落 在〈關於 PHP Short Tag〉中尚無留言

數年前寫過如何啟用 PHP short tag (<? … ?>) 的方法,但某次鬼打強後,還是建議關閉 short tag。

某次要產生 XML,沒注意到 XML 的 header 居然是「<?」,使得機器把本來不該是 PHP 的程式片段也當成 PHP 執行了:

<?xml version="1.0"?>
<contact>
   <person name="Zero">
   <person name="John">
</contact>

以後需要產生資料,還是用 template engine 處理吧。

Tags:PHP

Pear DB 鬼打牆

Posted on 2013 年 4 月 14 日2021 年 3 月 12 日 By 日落 在〈Pear DB 鬼打牆〉中尚無留言

前幾天改別人的程式時,用到 Pear DB 的 prepare / binding query 來修改資料:

$sql = "update log set 'enable' = ? where 'size' != 100";
$db->query($sql, array('true') );

但是程式執行卻一直噴錯誤訊息:

DB Error: mismatch

奇怪,問號只有一個啊,語法丟到 PhpMyAdmin 也可以正常執行,但為什麼會錯!?

搞了半天,原來 Pear DB 支援的 placeholder 有三種:

  • ?
  • !
  • &

好死不死 SQL 後半段有個「!=」,所以就 GG 了。這個 error 跟之前全形空白真的有拼 ….。

Tags:PHP

文章分頁

上一頁 1 ... 18 19 20 ... 27 下一頁

其他

關於我  (About me)

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Raspberry Pi Ubuntu Unix Vim Web Windows XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.