iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 7
0
自我挑戰組

花式PHP系列 第 7

Array:取得資料

今天要介紹的方法都是我最喜歡的!

array_rand

這個方法可以讓你從陣列中隨機挑一個值
但要注意的是,它回傳的是那個值的 key

所以如果你要取得它挑出的值,你需要回頭再把 key 塞進陣列才行~

<?php

$types = [
    '紅豆',
    '奶油',
    '羅蔔',
    '地瓜',
    '芋頭',
];

$index = array_rand($types);

echo $types[$index];

第二個可選變數:要挑幾個

上面的範例是在不給定第二個變數時,array_rand 只會隨機挑出一個,並直接以 int 回傳。

但如果你在第二個變數給定一個大於 1 的數字
array_rand 就會回傳一個 array,裡面都是它挑出來的值的 index

<?php

$types = [
    '紅豆',
    '奶油',
    '羅蔔',
    '地瓜',
    '芋頭',
];

$indexes = array_rand($types, 2);

foreach ($indexes as $index) {
    echo $types[$index] . PHP_EOL;
}

array_column

array_column 可以幫你從一個二維陣列中,僅取出每個第二層陣列中的指定欄位

PHP7 之後這個方法也接受傳入一個裡面都是 Object 的陣列!
具體的效果你可以把 WheelPieFactory::get(5, FALSE); 中的 FALSE 改成 TRUE,
再把程式碼丟進 PHP7 的環境測試~

但只能取出 Object 中是 public 的資料。
如果你需要取出 private 的資料,
你需要實作他們的 __get()__isset 兩個方法!

/images/emoticon/emoticon71.gif

例子時間~
某個你還是國小生時的禮拜三下午,成長中的你精力無限、餓的也特別快。
來的好不如來的巧,此時此刻你的媽媽也帶著五個車輪餅回家了!

但,可惜的是媽媽請老闆隨便夾了五個紅豆餅。
只喜歡其中幾種的你,要如何分辨每一個都長的一模一樣的車輪餅的口味呢?

還好 PHP 沒有辦不到的事情!
試著用 array_column 把五個紅豆餅的口味資訊抓出來吧!

<?php

class WheelPie
{
    public $type;
    public $price;
    
    public function __construct($type, $price)
    {
        $this->type = $type;
        $this->price = $price;
    }
}

class WheelPieFactory
{
    public static $types = [
        '紅豆',
        '奶油',
        '羅蔔',
        '地瓜',
        '芋頭',
    ];
    
    public static function get($counts, $returnObject = FALSE)
    {
        return array_map(
            function () use ($returnObject) {
                
                /**
                 * Static Property
                 * @see http://php.net/manual/en/language.oop5.static.php#language.oop5.static.properties
                 */
                $type = static::$types[array_rand(static::$types)];
                $price = rand(10, 20);
                
                /**
                 * 可以用 compact 簡化 ==> compact('type', 'price')
                 * 
                 * @see http://php.net/manual/en/function.compact.php
                 */
                 $arrayResult = [
                    'type' => $type,
                    'price' => $price
                ];
                
                return $returnObject
                    ? new WheelPie($type, $price)
                    : $arrayResult;
            },
            range(1, $counts)
        );
    }
}

$mother = WheelPieFactory::get(5, FALSE);

// print_r($mother);

print_r(array_column($mother, 'type'));

array_keys & array_values

顧名思義,array_keys 可以把陣列的 keys 單獨抽出來(並以陣列的方式回傳);
array_values 可以把陣列的 values 單獨抽出來(而且不保留原本的 key

注意!
它們兩個都不會對傳入的陣列本身操作,而是直接把結果傳回來。

比如說,你現在站在一個水果攤前面,
價目表上羅列著各種水果的單價...

<?php

$kanban = [
    '橘子' => 15,
    '桃子' => 30,
    '水梨' => 50,
    '芭樂' => 25,
    '香蕉' => 10,
];

但如果你也是在開水果行的,而你只想要知道這間店有賣哪些水果,
你就可以使用 array_keys 把它們列出來:

print_r(array_keys($kanban));

但如果你是一個記者,你只想要知道每種水果的售價,並用它們作為報導的材料:

print_r(array_values($kanban));

array_unique

顧名思義!這個方法可以幫你把陣列裡面重複的值去掉,並把處理乾淨的陣列回傳給你~

那它是如何比較各個元素是否一樣呢?
其實,它會把兩個需要被比較的值當成 String,並用全等運算符(===)比較它們。

注意!這個方法只會回傳每個重複值的第一個!

另外,array_unique 的第二個可選參數可以告訴它:
應該把陣列中的值視為怎樣的資料型態(預設是 String),並比較它們。

我就不寫僅包含基本資料型態的陣列被執行 array_unique 之後的效果了。
底下我展示的是,當一個陣列裡都是物件的狀況。

先講結論,
裡面這些物件都必須實作 __toString 方法才能被比較哦~

<?php

class WheelPie
{
    public $type;
    public $price;
    
    public function __construct($type, $price)
    {
        $this->type = $type;
        $this->price = $price;
    }
    
    public function __toString()
    {
        return $this->type;
    }
}

class WheelPieFactory
{
    public static $types = [
        '紅豆',
        '奶油',
        '羅蔔',
        '地瓜',
        '芋頭',
    ];
    
    public static function get($counts, $returnObject = FALSE)
    {
        return array_map(
            function () use ($returnObject) {
                
                $type = static::$types[array_rand(static::$types)];
                $price = rand(10, 20);
                
                 $arrayResult = [
                    'type' => $type,
                    'price' => $price
                ];
                
                return $returnObject
                    ? new WheelPie($type, $price)
                    : $arrayResult;
            },
            range(1, $counts)
        );
    }
}

$pies = WheelPieFactory::get(10, TRUE);

print_r(array_unique($pies));

上一篇
Array:操作、查詢
下一篇
Array:用語統一
系列文
花式PHP31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言