<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>

                ## 場景假設 先從一個引用的所謂詭異問題開始。假設我們有這個場景:我們從數據庫中讀取了一組訂單數據,需要把訂單的每條數據單獨做些處理。 $orders = [ ['orderid' => '123', 'total_fee' => 10, 'name' => 'zhangsan'], ['orderid' => '456', 'total_fee' => 17, 'name' => 'lisi'], ['orderid' => '789', 'total_fee' => 14, 'name' => 'wangwu'], ]; foreach ($orders as &$item) { // 對訂單做了些什么處理 } // 有了一些其它操作 $result = [];// 需要返回的結果 foreach ($orders as $item) {// 重新映射名字 $result[] = [ 'order_id' => $item['orderid'], 'amount' => $item['total_fee'], ]; } 上面的程序會輸出如下結果: var_dump($result); array(3) { [0]=> array(2) { ["order_id"]=> string(3) "123" ["total_fee"]=> int(10) } [1]=> array(2) { ["order_id"]=> string(3) "456" ["total_fee"]=> int(17) } [2]=> array(2) { ["order_id"]=> string(3) "456" ["total_fee"]=> int(17) } } 這就是經常遇到的一種所謂的詭異問題,先用引用循環處理數據,后面又用了與引用相同的臨時變量繼續處理數據。這里就是:$item。很多同學說預防這種問題,就要少用引用。這種態度太消極了,引用在很多地方帶來了代碼書寫的簡潔,并且針對大數組使用引用能夠節省大量的內存。 ## 詭異問題解析 現在我們來分析下上面問題出現的原因。先來看引用的定義 引用意味著用不同的名字訪問同一個變量內容。 那么在這部分代碼中 foreach ($orders as &$item) { // 對訂單做了些什么處理 } $item 最后跟 $orders[2] 指向了同一個變量內容。并且在 foreach 循環完后,$item 并沒有被銷毀,因此在后續如果同名的話,會繼續生效。 那么再接下來的的另一個循環中。 foreach ($orders as $item) {// 重新映射名字 $result[] = [ 'order_id' => $item['orderid'], 'amount' => $item['total_fee'], ]; } 復制代碼每當 $orders 把變量賦值給 $item 的時候,都同時改變了 $orders[2] 的值。因此才會出現上面詭異的情況。我來逐步給大家演示下: 第一次循環 $orders[0],$item 指向 orderid=123 的訂單,由于 $item 是 $orders[2] 的引用,此時導致 $orders[2] 也指向了 orderid=123 的訂單; 第二次循環 $orders[1], $item 指向 orderid=456 的訂單,因此 $orders[2] 也指向了 orderid=456; 第三次循環 $orders[2]的時候,明顯其值已經變成了 orderid=456 的訂單。 通過上面的分析,我相信大家對引用所謂的詭異有了了解。那么又該如何避免這種情況出現呢?其實很簡單,每次使用完引用后,記得 unset 調引用。在后面便可毫無顧忌的繼續使用了。具體到本例子就是: foreach ($orders as &$item) { // 對訂單做了些什么處理 } unset($item); // 有了一些其它操作 foreach ($orders as $item) {// 重新映射名字 } ## 引用的妙用 前面我說過,引用可以寫出簡潔的代碼。無限級分類的使用便是一個使用場景。比如說我們有個分類的數據: $catList = [ '1' => ['id' => 1, 'name' => '顏色', 'parent_id' => 0], '2' => ['id' => 2, 'name' => '規格', 'parent_id' => 0], '3' => ['id' => 3, 'name' => '白色', 'parent_id' => 1], '4' => ['id' => 4, 'name' => '黑色', 'parent_id' => 1], '5' => ['id' => 5, 'name' => '大', 'parent_id' => 2], '6' => ['id' => 6, 'name' => '小', 'parent_id' => 2], '7' => ['id' => 7, 'name' => '黃色', 'parent_id' => 1], ]; 如果我想得到下面這種形式 $result = [ ['id' => 1, 'name' => '顏色', 'children' => [ ['id' => 3, 'name' => '白色'], ['id' => 4, 'name' => '黑色'], ['id' => 7, 'name' => '黃色'] ]], ['id' => 2, 'name' => '規格', 'children' => [ ['id' => 5, 'name' => '大'], ['id' => 6, 'name' => '小'] ]] ]; 如果使用引用,可以非常簡單的得出結果。 $treeData = [];// 保存結果 foreach ($catList as $item) { if (isset($catList[$item['parent_id']]) && ! empty($catList[$item['parent_id']])) {// 肯定是子分類 $catList[$item['parent_id']]['children'][] = &$catList[$item['id']]; } else {// 肯定是一級分類 $treeData[] = &$catList[$item['id']]; } } 大家可以試試不用引用的方式,把無限級實現出來試試,比較下代碼。
                  <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>

                              哎呀哎呀视频在线观看