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 格式的 索引数组. 即便 返回的是空, 没有内容, 也是一个 空数组, 即: "[ ]"????

相关文章
相关标签/搜索