[PHP] 使用兩個問號 (Null Coalescing Operator) 簡易判斷並賦值

在 PHP 5.3 可以透過 ?: 運算子簡單的判斷並賦值

$foo = $bar ?: $baz;

上面的運算式等同:

$foo = $bar ? $bar : $baz;

但是在沒有宣告變數之前仍然會出現錯誤訊息。而 PHP 7.0 開始支援兩個問號 (??) 判斷並賦值,而且不用事先使用 isset() 判斷變數是否存在:

$username = $_GET['user'] ?? 'nobody';

上面的運算式等同:

$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

而且可以串一個以上的判斷:

$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

References

Leave a comment

[Laravel] 使用 MigrateSpecific 遷移指定檔案到資料庫

當我們將 migration file 遷移到資料庫後,日後想要直接修改原先的 migration file 而不是新增一個去做結構變更時,可以透過 migrate:refresh 重新遷移,但是如果前一次遷移包含多個檔案時,這些資料表都會受到影響;若想要修改的資料表不屬於上一個批次(batch),透過 –step 選項去做遷移,影響範圍就會更大。

常見的做法是建立一個臨時目錄,將 migration file 放進去後執行遷移,但是這個做法僅適用於第一次遷移;另一種方式是修改資料表 migrations 的批次號碼,讓指定的 migration file 成為上一個批次。

這些都是臨時性做法,若是有很多批要修改就會很麻煩,所以我就寫了一個小工具,之後用一行指令就可以解決這個問題。

 

Package Name: MigrateSpecific
Version: 1.2.1
Site: https://github.com/caloskao/migrate-specific

Read more “[Laravel] 使用 MigrateSpecific 遷移指定檔案到資料庫”

Leave a comment

[PHP] 提升 json_encode() 資料可讀性

PHP 可藉由 json_encode()json_decode() 來編碼與解碼 JSON 格式的資料,在一般情況下不需要特別給予任何參數,但如果將 JSON 格式資料直接儲存的話,預設是儲存一行文,在不靠任何工具的前提下僅以肉眼辨識會顯得有點吃力。

$data = [
    '5b8e2e456106f8.12710761' => [
        'id' => '5b8e2e456106f8.12710761',
        'description' => '',
        'options' => [],
        'size' => 1243916,
        'create_at' => '2018-09-04 15:04:02'
    ]
];
echo json_encode($data);

 

輸出如下:

{"5b8e2e456106f8.12710761":{"id":"5b8e2e456106f8.12710761","description":"","options":[],"size":1243916,"create_at":"2018-09-04 15:04:02"}}

 

如果想要提升 JSON 格式資料的可讀性,只需要將 json_encode() 的第二個參數設為 JSON_PRETTY_PRINT 即可。

echo json_encode($data, JSON_PRETTY_PRINT);

 

輸出:

{
    "5b8e2e456106f8.12710761": {
        "id": "5b8e2e456106f8.12710761",
        "description": "",
        "options": [],
        "size": 1243916,
        "create_at": "2018-09-04 15:04:02"
    }
}

 

PHP 5.6.6 以上可選擇的參數共有 11 個,詳細說明可見 PHP 官網 

 

 

 
 
Leave a comment

[PHP] 如何判斷關聯式陣列與循序式陣列?

PHP 陣列索引預設為由 0 開始遞增的循序數列,同時也支援自行設定索引值。

// 序列式
$sequentialArray = ['A', 'B', 'C'];
/*
Array
(
    [0] => A
    [1] => B
    [2] => C
)
*/

// 關聯式
$associativeArray = ['a' => 'A', 'b' => 'B', 'c' => 'C'];
/*
Array
(
    [a] => A
    [b] => B
    [c] => C
)
*/

判斷兩者的方式為檢查陣列索引是否為一公差為 1 的循序數列。先利用 array_keys() 取得所有陣列索引值後,再利用 range() 產生一個循序整數陣列,比對兩者內容即可判斷:

function is_assoc( array $array ) {
    if ( [] === $array ) return false;
    return array_keys($array) !== range(0, count($array) - 1);
}

var_dump( is_assoc(['a', 'b', 'c']) ); // false
var_dump( is_assoc(['0' => 'a', '1' => 'b', '2' => 'c']) ); // false
var_dump( is_assoc(['1' => 'a', '0' => 'b', '2' => 'c']) ); // true
var_dump( is_assoc(['a' => 'a', 'b' => 'b', 'c' => 'c']) ); // true

Reference: How to check if PHP array is associative or sequential? – Stack Overflow

Leave a comment