tp使用ajaxReturn返回二維數組格式的字符串,前臺如何獲取非亂碼

參考: https://www.cnblogs.com/jiqing9006/p/5000849.html https://blog.csdn.net/zengxiangxuan123456/article/details/51203651javascript

使用 tp的 $this->ajaxReturn($result, 'json') 返回的數據 已經 是 一個 js的對象了.

select 的返回結果是 一個數組, 這個數組的每一個元素都是一個 js對象.php

因此 返回的是 $result 是一個 js的對象 組成的 js數組. 並且 下標是 0, 1, 2,...html

若是通過 屢次html/js/php的跳轉 , 最後獲得的頁面中, 在 firebug中的調試控制檯 可能沒法輸出 console.log(ajaxReturn)返回結果了. 因此 不便於調試, 可是, 能夠經過 network 的xhr 中的file(是指 ajax的 目標文件) 中的 params: 傳遞給 目標的參數值, 和 reponse(返回給 ajax的數據) . 能夠看到 已是 json格式的 數組了 , 有兩個 一個下標是0, 一個下標是1, 並且每一個元素 都是 json 格式的 js對象. 因此 能夠 用 : result[0].propertyName來獲取. 這個也正是目標 php頁面自己 給出的 二維數組的 基本原型. 即仍然保持了 select 結果的數組, 只是 將 每一個元素 由 原來的 數組形式轉變成了 json格式的js對象了: 即: 從 array("property1" => value1, "property2"=> value2,....) 的數組 轉變成了: {"proptery1": "str_value1", "property2" : num_value2,....}

Easyui中使用jquery或js動態添加元素時出現的樣式失效的解決方法
可使用$.parser.parse();這個方法進行處理;

$.parser.parse();
表示對整個頁面從新渲染,渲染完就能夠看到easyui原來的樣式了;
 
var targetObj = $("<input name='mydate' class='easyui-datebox'>").appendTo("#id");
$.parser.parse(targetObj);
表示從新渲染某個特定的組件。

Syntax Error: missing formal parameter?

意思是: 語法錯誤: 缺乏 形式參數. formal: 莊重的, 正式的; 正式場合的; 形式的, 外形的(形參: formal parameter)java

多個相同class的按鈕超連接 如何知道是 單擊的哪個按鈕? 如何在 onclick中肯定 是哪個按鈕被單擊?

  • 因爲 不能??? 在 onclick中 傳遞 this參數?
  • 因此, 在 onclick的函數中 , 傳遞一個 序列號, i(index)
    而後 在 函數原型中, 遍歷jquery對象時, 來判斷 遍歷 序號 是否和 onclick函數傳遞過來的 i 是否相同, 若是相同, 則說明是 單擊的 當前 超連接a , 執行事件後, 便可以return false=break.
var cxstr=' some content....;
  for(var i=0; i<rt.length; i++){
     cxstr += '<a class="detail" style="text-decoration: none;" href="javascript: void(0)" onclick="detail('+i+')"><span class="glyphicon glyphicon-menu-right"></span> 詳情</a>';
  
  cxstr += '<div id="detail" style="display: none; margin-left: 16px;padding-top:8px;">\  注意這種複雜字符串的換行寫法
         <table class="table table-striped table-bordered table-hover">\
         <tr> <td>001</td> <td>001</td> <td>001</td> <td>001</td> </tr>\
         <tr> <td>002</td> <td>002</td> <td>002</td> <td>002</td> </tr>\
         <tr> <td>003</td> <td>003</td> <td>003</td> <td>003</td> </tr>\
         <tr> <td>004</td> <td>004</td> <td>004</td> <td>004</td> </tr>\
         <tr> <td>005</td> <td>005</td> <td>005</td> <td>005</td> </tr>\
         </table>\
      </div>';
    cxstr += '<hr></div>'
  }
  $('div#cx').html(cxstr);
}

function detail(i){
  $('a.detail').each(function(index){
    if(index == i){
      $(this).next().toggle();
      $(this).children().toggleClass('glyphicon-menu-right').toggleClass('glyphicon-menu-down');
      return false; 
    }
  });

關於分組查詢?

M('user') ->... -> group('user_id') -> select(); , 分組group是連貫操做. 參數只能是 字符串.
特別注意的是: 分組操做, 只會 返回惟一的 一條記錄: 是 這個分組中 全部記錄中的 第一條 記錄. 因此, 即便在 這個 分組中 包含多條記錄, 也只能 獲得 第一條記錄.
所以, 正由於這個特性, 因此 分組 操做一般不以 獲得原始記錄 數據 爲 目的, 而是 以 獲得 統計 數據如 某一組中的 最大值/最小值/平均值 爲 目的.jquery

子查詢, 也叫 嵌套查詢c++

  • 就是 在 須要 表 的 地方 , 用 select.... 語句 代替
  • 它的用法是 固定的: 就是 select ....語句 , 用 小括號括起來 而且緊跟着 一個 別名. 即: ..... from (select .... from ....) sub_table ....
    子查詢主要 用在 兩個地方:
  • 一個是 from 子句中 : select sth... from (select .... from ....) sub_table ....
  • 另外一個是 inner join 內聯查詢中: .... inner join (select ... from ...) sub_table on .....

參考: https://my.oschina.net/u/1260221/blog/3051394ajax

===============================編程

對於 php來講, 語言自己提供的 功能, 基本上 都是 函數! 由於 最初的php是 面向過程的, 沒有面向對象! 因此 它的數組 / 字符串等 都不是以對象的 方式來處理的. 所以, 在使用 關於 數組等的 函數 時, 就不要用 點語法, 而是用 全局函數, 好比: count, array_diff, in_array, array_values等. 是函數庫

  • 數組的交集和差, 自己就有 內置函數 沒必要本身去寫自定義函數了: 就是 array_intersect, array_diff. (只是注意的是, 最後結果保留的老是 , 第一個函數的 鍵)
  • 並且, 數組的差集, 直接使用 array_diff就能夠了,而沒必要再使用 intersect: array_diff($arr1, $arr2);就行了
  • 可是: 數組的差集, 只能使用 一維數組! 若是是二維數組, 是 不能直接進行 相減的, 不然只能是返回NUll或空值: 參考: https://blog.csdn.net/neddiepeng/article/details/85246085

刪除數組中的元素, 可是要索引重排?

  • unset能夠刪除數組中的元素, 可是 原來的數組 下標鍵 不會 重排.
  • 若是要刪除數組元素, 並且原來的數組元素能夠重排的話, 須要使用 array_splice array_splice($原數組, 刪除開始start, 刪除長度length, $用來替換的數組)
    因此, 不論是
  • 要注意unset的陷阱: unset($a[0])將第1個元素給刪除了,可是輸出時,咱們還從$i=0 開始的,固然就不對了,php可不會自動調整下標的。
  • unset一個變量時, 相似於c++中delete一個內存變量, 將釋放這個內存變量所佔用的內存空間

php在for, foreach循環中, 不要企圖去更改/刪除 被遍歷 的遍歷對象$result, 由於不論是用 unset($result[$i]) 的陷阱, 仍是用 array_intersect, array_diff(diff 是比較 兩個/多個數組之間的區別, 那天然就是獲得 差集.仍是 用 array_splice(膠接) 等, 都會致使 被遍歷對象的 元素減小, 而循環遍歷中, 雖然循環變量$i 只是第一次的時候初始化 一次 for(var $i=0...), 可是 中間的 比較計算 是 每一 次都要進行的, 並且 $i<count($result); 這個 $i是不斷再增長的, 而count($result)是不斷在減少的。所以, 當$i遍歷幾回後, 好比 $result 的元素總共只有4個的時候, 那麼就會發生 遍歷變量$i 大於 count的狀況,(當$i=2, 再增長一次$i=3的時候, count($result)就只有2了,從而退出循環) 從而剩下的 $result就不能被 徹底遍歷了。 所以, 在後面 遍歷的時候, 就會 發生數組元素下標出問題的狀況,(不是數組下標溢出, 而是根本就遍歷不到, 循環都已經退出了! ) 從而得不到你想要的結果.

  • 只能 一直用 當前這個 不變的 遍歷對象進行遍歷.
  • 若是 遍歷 結束後, 你確實以爲 被遍歷對象 比較大, 佔用 內存的話, 能夠用 unset($result) 將這個 "大變量" 刪除釋放.

php銷燬變量的 unset和 null之間的區別? unset($foo) 真的就必定 釋放 了$foo所佔的內存空間嗎?

參考: https://blog.csdn.net/DickyQie/article/details/79224118, https://blog.csdn.net/fationyyk/article/details/70212184json

  • 只有當被銷燬變量所佔的內存空間大於256bytes時, 纔會被銷燬釋放內存
  • 只有當 全部指向 內存區域的 全部(變量) 引用 都被刪除時, 內存空間 纔會真正被釋放
  • php的變量存放其實是兩個地方: 一個是 函數棧的內存區域(是變量名, 並無存放具體的內容, , 存放的只是指向內存堆區的地址), 另外一個纔是 在內存堆區的內容. 它們之間 有一個地址指向的聯繫紐帶. 所以 unset的時候 只是 幹掉了 該變量名, 切斷了 變量名和 內存區之間的關聯. 可是這個內存區並無真的被釋放: 即其餘變量並不能使用這個內存區域.
  • 經過 str_repeat('a', 1000)和 memory_get_usage([false]): 獲取系統分配給 當前php腳本的實際 內存量. 不能獲取某個變量的內存使用量, 只能是 整個腳本的佔用量, 返回的是一個 int值.
  • 直接將 變量設置 爲 null 則 即便其餘變量仍在引用它, 這個內存區域仍是會被 銷燬.
  • php的內存申請和銷燬 並非 像表面上的, 有不少 背後操做. 好比 它向系統申請內存時, 不必定是申請 當前變量須要的那點內存區, 而是可能一次申請大塊內存區, 而當某個變量被unset時, 也不必定 將這個內存區還給 os, 而是有可能做爲它的緩存區域來使用.( 這樣能夠減小 系統調用的開銷). 因此, 不必定你 unset的時候, 內存就真的 釋放了! 可是, 咱們編程的代碼 仍是應該這樣寫, 思惟應該這樣寫, 至於具體實際的事, 讓php和系統去作)

======================================數組

關於exit和die? https://blog.csdn.net/Tacks/article/details/86542333

  • 二者是同樣的,別名: 可是在語義上能夠略做區別: 若是是想調試、條件終止、提早終止程序的話, 能夠用 exit, 若是是想在出錯的時候, 要終止的話,就用 die。
  • exit(die)是一種語法結構,不是函數, 相似於for, if, while等這樣的語法結構,因此 在沒有 「參數」 的時候, 最好是直接使用 exit、 die, 不要加括號
  • exit(status)的status能夠是 兩種: 一種是 字符串, 一種是 int 。 若是是int, 則表示 退出狀態代碼, 範圍在 0~255, 0表示成功退出程序, 255是php保留的不能用, 其餘1~244表示的是 未成功退出。 可是要注意,status代碼不會輸出!
    可是, exit(‘string’)若是是字符串的話, 則會輸出這個字符串! 而後退出。
  • exit這個函數沒有 返回值, 是void。 可是會輸出字符串! 因此 exit(var_foo), exit('1'), 等都會輸出字符串 因此, exit實際上就等於 先echo 字符串+ 後退出腳本
  • 可是 exit 也有擋不住的代碼即: register_shutdown_function( '函數名’); 和類的析構函數 __destruct. 即便在代碼調用了 exit 後, 它以前的 : register_shutdown_function, 和 類的 析構函數 都會被 執行 , 而後才退出腳本。

js中遍歷數組、對象的方法不少種, 包括 for, foreach, for ..in , map 等。 可是 實際上性能最好的(最優雅的)仍是 普通的、通過優化的for循環,優化是: 將數組的長度在第一次初始化賦值的時候存起來, 即: for(var i=0 , len=arr.length; i<len; i++).... 參考: https://www.cnblogs.com/lvmh/p/6104397.html

可是, 是否是要遍歷 訪問數組或 對象的 屬性名, 則必須使用 for ...in : for(var name in arr_or_obj) {....}

如何判斷一個對象爲空對象{} ?

  • 在jquery中有一個函數: $.isEmptyObject(foo_obj); 專門用來判斷.對象是否爲空對象. isEmptyObject 的原型 中的關鍵代碼是: function isEmptyObject(foo){for(var key in obj){ return false;) return true;}
  • 對象的長度不能用.length獲取( length只能是對 於數組而言的 ! ),用js原生的Object.keys能夠獲取到: arr=Object.keys(obj),keys返回的是由對象的 屬性名稱 組成的數組. 而後判斷 arr的length.

  • tp的 ajaxReturn返回的 老是一個 由對象組成的 json 格式的 索引數組. 即便 返回的是空, 沒有內容, 也是一個 空數組, 即: "[ ]"????

相關文章
相關標籤/搜索