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

使用 tp的 $this->ajaxReturn($result, 'json') 返回的数据 已经 是 一个 js的对象了.

select 的返回结果是 一个数组, 这个数组的每个元素都是一个 js对象.

所以 返回的是 $result 是一个 js的对象 组成的 js数组. 而且 下标是 0, 1, 2,...

如果经过 多次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)

多个相同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是连贯操作. 参数只能是 字符串.

特别注意的是: 分组操作, 只会 返回唯一的 一条记录: 是 这个分组中 所有记录中的 第一条 记录. 所以, 即使在 这个 分组中 包含多条记录, 也只能 得到 第一条记录.

因此, 正因为这个特性, 所以 分组 操作通常不以 得到原始记录 数据 为 目的, 而是 以 得到 统计 数据如 某一组中的 最大值/最小值/平均值 为 目的.

子查询, 也叫 嵌套查询

  • 就是 在 需要 表 的 地方 , 用 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/3051394

===============================

对于 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/70212184

  • 只有当被销毁变量所占的内存空间大于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 格式的 索引数组. 即使 返回的是空, 没有内容, 也是一个 空数组, 即: "[ ]"????

tp使用ajaxReturn返回二维数组格式的字符串,前台如何获取非乱码的更多相关文章

  1. 06-01 Java 二维数组格式、二维数组内存图解、二维数组操作

    二维数组格式1 /* 二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的 ...

  2. dbda封装类(包括:返回二维数组、Ajax调用返回字符串、Ajax调用返回JSON)

    <?php class DBDA { public $host = "localhost"; public $uid = "root"; public $ ...

  3. PHP中将二维数组 转换成字符串

    function arr_to_str($arr) { $t ='' ; foreach ($arr as $v) { $v = join(",",$v); // 可以用implo ...

  4. Mojo 返回一维和二维数组

    这种情况不断的网数组@arr2里放入数据,返回的内容为: 这种情况是一维数组: while( $selStmt->fetch() ){ print "\$a1 is $a1\n&quo ...

  5. axis2生成webservice服务端返回String[]和String[][]一维数组和二维数组解析

    环境:用axis2生成服务端,用aixs做客户端 1:直接返回String[]: public String[] testArr(String name) { String[] ret=new Str ...

  6. ***php解析JSON二维数组字符串(json_decode函数第二个参数True和False的区别)

    客户端的请求体中的数据:[{"msg_id": 1, "msg_status": "HAS_READ" }, { "msg_id& ...

  7. [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组

    1.数组基础 1.什么是数组:           同一类型数据的集合,就是一个容器. 2.数组的好处:           可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式:  (一 ...

  8. C语言基础--二维数组

    二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...

  9. 二维数组的传输 (host <-> device)

    前言 本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端. 实现步骤 1. 在显存中为二维数组开辟空间 2. 获取该二维数组在显存中的 pitch 值 (cudaMa ...

随机推荐

  1. MongoDB Spark Connector 实战指南

    Why Spark with MongoDB? 高性能,官方号称 100x faster,因为可以全内存运行,性能提升肯定是很明显的 简单易用,支持 Java.Python.Scala.SQL 等多种 ...

  2. Vuex状态数据源state

    (1)单一状态树 Vuex 使用单一状态,用一个对象就包含了全部的应用层级状态.至此它便作为一个“唯一数据源 (SSOT)”而存在.这也意味着,每个应用将仅仅包含一个 store 实例. 单一状态树让 ...

  3. fork以后子进程输出cout无法输出

    fork以后子进程输出cout无法输出 fork以后子进程输出cout无法输出 子进程 fork  cout<<"sdfsf"<<endl; 内容无法输出控 ...

  4. 线程的等待与唤醒,实现if...else里面的值交互依次输出

    线程通信原理图: 资源类: package com.yonyou.sci.gateway.exec.threadnet; public class Resource { String name; St ...

  5. ThreadLocal如何回收value,什么时候回收?(学习笔记)

    1)ThreadLocal如何回收value,什么时候回收?从ThreadLocal中的内部类分析:① static class ThreadLocalMap { /** * The entries ...

  6. iOS 图像渲染原理

    http://chuquan.me/2018/09/25/ios-graphics-render-principle/ 通过 图形渲染原理 一文,大致能够了解图形渲染过程中硬件相关的原理.本文将进一步 ...

  7. 2019阿里JVM组实习面经

    面试质量非常高....非常高...高... 一面 自我介绍 看过hotspot哪些模块,模板解释器工作说一下,生成的native code放在哪,怎么处理safepoint的 说项目,实现了哪些字节码 ...

  8. C# Chart 曲线(多曲线展示)

    //绑定显示曲线数据(Chart控件名:) //X轴标题 this.CurveChart.ChartAreas["ChartArea1"].AxisX.Title = " ...

  9. C#中RadioButton选中和取消选中(一种没办法选中和未选中切换)

    今天在做Winform 中RadioButton控件时,遇到一个小坑,虽然很简单,但是浪费我十分钟,感觉需要记录一下共勉. 问题描述:(RadioButton控件名为rbTime) 本来以为判断一下是 ...

  10. nginx部署项目

    nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发 ...