<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 數組助手類 除了[PHP中豐富的數組函數集](http://php.net/manual/zh/book.array.php), Yii 數組助手類提供了額外的靜態方法,讓你更高效地處理數組。 ## 獲取值 用原生PHP從一個對象、數組、或者包含這兩者的一個復雜數據結構中獲取數據是非常繁瑣的。 你首先得使用`isset`?檢查 key 是否存在, 然后如果存在你就獲取它,如果不存在, 則提供一個默認返回值: ~~~ class User { public $name = 'Alex'; } $array = [ 'foo' => [ 'bar' => new User(), ] ]; $value = isset($array['foo']['bar']->name) ? $array['foo']['bar']->name : null; ~~~ Yii 提供了一個非常方便的方法來做這件事: ~~~ $value = ArrayHelper::getValue($array, 'foo.bar.name'); ~~~ 方法的第一個參數是我們從哪里獲取值。第二個參數指定了如何獲取數據, 它可以是下述幾種類型中的一個: * 數組鍵名或者欲從中取值的對象的屬性名稱; * 以點號分割的數組鍵名或者對象屬性名稱組成的字符串,上例中使用的參數類型就是該類型; * 返回一個值的回調函數。 回調函數如下例所示: ~~~ $fullName = ArrayHelper::getValue($user, function ($user, $defaultValue) { return $user->firstName . ' ' . $user->lastName; }); ~~~ 第三個可選的參數如果沒有給定值,則默認為?`null`,如下例所示: ~~~ $username = ArrayHelper::getValue($comment, 'user.username', 'Unknown'); ~~~ 對于取到值后想要立即從數組中刪除的情況,你可以使用?`remove`?方法: ~~~ $array = ['type' => 'A', 'options' => [1, 2]]; $type = ArrayHelper::remove($array, 'type'); ~~~ 執行了上述代碼之后,?`$array`?將包含?`['options' => [1, 2]]`?并且?`$type`?將會是?`A`?。 注意和?`getValue`?方法不同的是,`remove`?方法只支持簡單鍵名。 ## 檢查鍵名的存在 `ArrayHelper::keyExists`?工作原理和[array_key_exists](http://php.net/manual/en/function.array-key-exists.php)差不多,除了 它還可支持大小寫不敏感的鍵名比較,比如: ~~~ $data1 = [ 'userName' => 'Alex', ]; $data2 = [ 'username' => 'Carsten', ]; if (!ArrayHelper::keyExists('username', $data1, false) || !ArrayHelper::keyExists('username', $data2, false)) { echo "Please provide username."; } ~~~ ## 檢索列 通常你要從多行數據或者多個對象構成的數組中獲取某列的值,一個普通的例子是獲取id值列表。 ~~~ $data = [ ['id' => '123', 'data' => 'abc'], ['id' => '345', 'data' => 'def'], ]; $ids = ArrayHelper::getColumn($array, 'id'); ~~~ 結果將是?`['123', '345']`。 如果需要額外的轉換或者取值的方法比較復雜, 第二參數可以指定一個匿名函數: ~~~ $result = ArrayHelper::getColumn($array, function ($element) { return $element['id']; }); ~~~ ## 重建數組索引 按一個指定的鍵名重新索引一個數組,可以用?`index`?方法。輸入的數組應該是多維數組或者是一個對象數組。 鍵名(譯者注:第二個參數)可以是子數組的鍵名、對象的屬性名, 也可以是一個返回給定元素數組鍵值的匿名函數。 如果一個鍵值(譯者注:第二個參數對應的值)是 null,相應的數組元素將被丟棄并且不會放入到結果中,例如, ~~~ $array = [ ['id' => '123', 'data' => 'abc'], ['id' => '345', 'data' => 'def'], ]; $result = ArrayHelper::index($array, 'id'); // the result is: // [ // '123' => ['id' => '123', 'data' => 'abc'], // '345' => ['id' => '345', 'data' => 'def'], // ] // using anonymous function $result = ArrayHelper::index($array, function ($element) { return $element['id']; }); ~~~ ## 建立哈希表 為了從一個多維數組或者一個對象數組中建立一個映射表(鍵值對),你可以使用?`map`方法.`$from`?和?`$to`?參數分別指定了欲構建的映射表的鍵名和屬性名。 根據需要,你可以按照一個分組字段?`$group`?將映射表進行分組,例如。 ~~~ $array = [ ['id' => '123', 'name' => 'aaa', 'class' => 'x'], ['id' => '124', 'name' => 'bbb', 'class' => 'x'], ['id' => '345', 'name' => 'ccc', 'class' => 'y'], ); $result = ArrayHelper::map($array, 'id', 'name'); // 結果是: // [ // '123' => 'aaa', // '124' => 'bbb', // '345' => 'ccc', // ] $result = ArrayHelper::map($array, 'id', 'name', 'class'); // 結果是: // [ // 'x' => [ // '123' => 'aaa', // '124' => 'bbb', // ], // 'y' => [ // '345' => 'ccc', // ], // ] ~~~ ## 多維排序 `multisort`?方法可用來對嵌套數組或者對象數組進行排序,可按一到多個鍵名排序,比如, ~~~ $data = [ ['age' => 30, 'name' => 'Alexander'], ['age' => 30, 'name' => 'Brian'], ['age' => 19, 'name' => 'Barney'], ]; ArrayHelper::multisort($data, ['age', 'name'], [SORT_ASC, SORT_DESC]); ~~~ 排序之后我們在?`$data`?中得到的值如下所示: ~~~ [ ['age' => 19, 'name' => 'Barney'], ['age' => 30, 'name' => 'Brian'], ['age' => 30, 'name' => 'Alexander'], ]; ~~~ 第二個參數指定排序的鍵名,如果是單鍵名的話可以是字符串,如果是多鍵名則是一個數組, 或者是如下例所示的一個匿名函數: ~~~ ArrayHelper::multisort($data, function($item) { return isset($item['age']) ? ['age', 'name'] : 'name'; }); ~~~ 第三個參數表示增降順序。單鍵排序時,它可以是?`SORT_ASC`?或者?`SORT_DESC`?之一。 如果是按多個鍵名排序,你可以用一個數組為各個鍵指定不同的順序。 最后一個參數(譯者注:第四個參數)是PHP的排序標識(sort flag),可使用的值和調用PHP?[sort()](http://php.net/manual/zh/function.sort.php)?函數時傳遞的值一樣。 ## 檢測數組類型 想知道一個數組是索引數組還是聯合數組很方便,這有個例子: ~~~ // 不指定鍵名的數組 $indexed = ['Qiang', 'Paul']; echo ArrayHelper::isIndexed($indexed); // 所有鍵名都是字符串 $associative = ['framework' => 'Yii', 'version' => '2.0']; echo ArrayHelper::isAssociative($associative); ~~~ ## HTML 編碼和解碼值 為了將字符串數組中的特殊字符做 HTML 編解碼,你可以使用下列方法: ~~~ $encoded = ArrayHelper::htmlEncode($data); $decoded = ArrayHelper::htmlDecode($data); ~~~ 默認情況只會對值做編碼(譯者注:原文中是編碼,應為編解碼)。通過給第二個參數傳?`false`?,你也可以對鍵名做編碼。 編碼將默認使用應用程序的字符集,你可以通過第三個參數指定該字符集。 ## 合并數組 ~~~ /** * 將兩個或者多個數組遞歸式的合并為一個數組。 * 如果每個數組有一個元素的鍵名相同, * 那么后面元素的將覆蓋前面的元素(不同于 array_merge_recursive)。 * 如果兩個數組都有相同鍵名的數組元素(譯者注:嵌套數組) * 則將引發遞歸合并。 * 對數值型鍵名的元素,后面數組中的這些元素會被追加到前面數組中。 * @param array $a 被合并的數組 * @param array $b 合并的數組,你可以在第三、第四個 * 參數中指定另外的合并數組,等等 * @return 合并的結果數組 (原始數組不會被改變) */ public static function merge($a, $b) ~~~ ## 對象轉換為數組 你經常要將一個對象或者對象的數組轉換成一個數組,常見的情形是,為了通過REST API提供數據數組(或其他使用方式), 將AR模型(活動記錄模型)轉換成數組。如下代碼可完成這個工作: ~~~ $posts = Post::find()->limit(10)->all(); $data = ArrayHelper::toArray($posts, [ 'app\models\Post' => [ 'id', 'title', // the key name in array result => property name 'createTime' => 'created_at', // the key name in array result => anonymous function 'length' => function ($post) { return strlen($post->content); }, ], ]); ~~~ 第一個參數包含我們想要轉換的數據,在本例中,我們要轉換一個叫?`Post`?的 AR 模型。 第二個參數是每個類的轉換映射表,我們在此設置了一個`Post`?模型的映射。 每個映射數組包含一組的映射,每個映射可以是: * 一個要包含的照原樣的字段名(和類中屬性的名稱一致); * 一個由你可隨意取名的鍵名和你想從中取值的模型列名組成的鍵值對; * 一個由你可隨意取名的鍵名和有返回值的回調函數組成的鍵值對; 這上面的轉換結果將會是: ~~~ [ 'id' => 123, 'title' => 'test', 'createTime' => '2013-01-01 12:00AM', 'length' => 301, ] ~~~ 也可以在一個特定的類中實現yii\base\Arrayable接口, 從而為其對象提供默認的轉換成數組的方法。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看