扫码关注官方订阅号
84669人学习
65727人学习
82984人学习
467778人学习
498837人学习
471966人学习
256484人学习
152542人学习
224170人学习
139536人学习
81804人学习
85022人学习
11944人学习
20001人学习
60816人学习
5487人学习
15007人学习
2150人学习
6980人学习
194925人学习
359900人学习
1142人学习
19058人学习
3206人学习
180550人学习
48569人学习
17603人学习
40936人学习
1049人学习
750人学习
32909人学习
就是这个数组,用了array_values 发现好像被重新排序了按照ID impolde提示数组不能作为参数,对象也用了,json 也转了。到底应该怎么去呢
更新:
这样已经可以了,但是我新的retlist 0 arrary_colum 之后,打印的结果[0]却跑到数组最后去了。
首先,你这个数据格式是JSON的,要先转成PHP数组。
$a = json_decode($a, TRUE);
json_decode第二个参数为TRUE表示保留键名,否则JSON转PHP数组之后,PHP数组的键名会重新排序。
json_decode
TRUE
然后将你数据中的$a['data']值用array_column处理,或者使用array_values,将数组值重排。
$a['data']
array_column
array_values
$a['Data'] = array_column($a['Data'], NULL); // 或者 $a['Data'] = array_values($a['Data']);
Data
[]
只要在PHP数组中,先按照上面的array_column或者array_values处理过$a['Data'],然后直接运行
$a['Data']
$a = json_encode($a);
注意json_encode第二个参数绝对不能用JSON_FORCE_OBJECT,否则还是会使Data变为对象{}。
json_encode
JSON_FORCE_OBJECT
{}
看了你的代码,我好像是知道你要干啥了,你是想找出原数组里ID值和$makeupId相等的项,然后把它提前到数组第一个?如果是这样你的代码写复杂了。通过array_column()这个神奇的函数,可以轻松实现你的需求。代码如下
$makeupId
array_column()
$newarr = []; $ret = array_column($ret, NULL, 'ID'); # 上面这行代码做了一个神奇的事情,就是将源代码的顺序保持不变,然后将ID作为了键值, # 生成了一个关联数组。 # # 下面简单讲一下array_column的神奇之处,它可以将像你这种数据格式的 # 二维数组(矩阵型二维数组)中的某一列拆出来,作为键值,另外一列拆出来作为键名, # 形成关联数组。 # # 当然,这个函数的定义array_column($source, $value_field[, $key_field]); # 其中, # $source为源数组, # $value_field为需要提取作为键值的名字,如果为NULL则将整个内层数组作为值 # (也就是保持原来的值不变,这个一般用于数组键名的重新生成) # $key_field为需要提取作为键名的名字,此处为'ID',如果为NULL或者省略, # 则会重新从0开始编号(配合上面$value_field为NULL可以重新排序数组) # # 然后给个简单说明: # $a = [ # 't' => ['id' => 1, 'name' => 'a'], # 'u' => ['id' => 2, 'name' => 'b'] # ]; # # 通过array_column($a, NULL)得到的是 # $a = [ # ['id' => 1, 'name' => 'a'], # ['id' => 2, 'name' => 'b'] # ]; # # 通过array_column($a, 'id')得到的是 # $a = [1, 2]; # # 通过array_column($a, NULL, 'id')得到的是 # $a = [ # 1 => ['id' => 1, 'name' => 'a'], # 2 => ['id' => 2, 'name' => 'b'] # ]; # # 通过array_column($a, 'name', 'id')得到的是 # $a = [ # 1 => 'a' # 2 => 'b' # ]; # 说了这么多你应该理解了这个函数的用法,上面那句 # $ret = array_column($ret, NULL, 'ID')将$ret变成了关联数组, # 这样$ret[$makeupId]就可以直接找到你需要提取的项了,是不是很方便? # # 下面接着给代码 if(!empty($ret[$makeupId])) { $newarr = $ret[$makeupId]; // 取出新对象 unset($ret[$makeupId]); // 删除原有数组中的对象 } $ret = array_column($ret, NULL); # 上面这行将关联数组再转回了顺序数组,但是别忘了, # 因为满足$makeupId的项被取到了$newarr,然后原数组中的$makeupId项被删掉, # 所以转回来的数组是不含满足$makeupId的项的。 # 接下来,将$newarr推到数组之前, # 此处注意,array_unshift()方法直接操作原数组,所以不需要赋值 array_unshift($ret, $newarr);
代码结束
然后,我再说一下,为什么你用array_values()和array_column()都会使顺序变乱。因为这两个函数都是会重新编号的,而且它编号的顺序,不是你键名的标签顺序,也就是说你键名手动写成0,1,2,3并不会使它重新编号时候按照0,1,2,3排序。它重新编号的顺序取决于你代码运行的顺序。也就是说,你最后那个...[0] = $newarr,其实并不是在数组开头,而是在整个数组的尾部,只是它的键名为0而已,所以你无论怎么努力,这个0对应的元素都是会跑到最后的。
array_values()
0,1,2,3
上面代码里注释解说比较多,这里贴一下纯代码:
$newarr = []; $ret = array_column($ret, NULL, 'ID'); if(!empty($ret[$makeupId])) { $newarr = $ret[$makeupId]; // 取出新对象 unset($ret[$makeupId]); // 删除原有数组中的对象 } $ret = array_column($ret, NULL); array_unshift($ret, $newarr); var_dump($ret);
再补充点内容吧,下面是除了array_column的几个可行的解决方案。
这个方案基于你原有代码修改。在你的代码倒数第二行($retlist = ...上面)加上
$retlist = ...
ksort($ret_list, SORT_NUMERIC);
这个方案也是基于你原有代码修改。将你代码中的$retlist[0] = $newarr;改为array_unshift($retlist, $newarr);
$retlist[0] = $newarr;
array_unshift($retlist, $newarr);
上面已经说过,array_column和array_values都会重新编号,重新编号的顺序取决于你定义对应值的顺序,而并非是键名的数字顺序,所以上面这个修改,是用数组头部推入项替代$retlist[0]的值定义和初始化。
$retlist[0]
这个也是基于你代码修改的。在你遍历之前,先定义好$retlist[0] = [],然后当你遍历到符合$makeupId项的时候,直接赋值给$retlist[0],这样,由于事先定义了$retlist[0],所以就算重新编号,它的顺序也是在第一个的。
$retlist[0] = []
是不是这个意思,就是光把键值去掉,相当于把多维数组去掉一层。如果是的话我写了一个大概的例子,你可以照着这个思路去实现一下,上图
json数据最好转换成php数组才好处理。不然很难处理的。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2024 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号
精品班
技术支持
技术咨询
学习群
会员优惠
返回顶部
如果你是要将JSON转成PHP数组,方法如下
首先,你这个数据格式是JSON的,要先转成PHP数组。
json_decode
第二个参数为TRUE
表示保留键名,否则JSON转PHP数组之后,PHP数组的键名会重新排序。然后将你数据中的
$a['data']
值用array_column
处理,或者使用array_values
,将数组值重排。如果你是要将PHP转成JSON,但是要使
Data
中Data
为数组[]
。只要在PHP数组中,先按照上面的
array_column
或者array_values
处理过$a['Data']
,然后直接运行注意
json_encode
第二个参数绝对不能用JSON_FORCE_OBJECT
,否则还是会使Data变为对象{}
。Update
看了你的代码,我好像是知道你要干啥了,你是想找出原数组里ID值和
$makeupId
相等的项,然后把它提前到数组第一个?如果是这样你的代码写复杂了。通过array_column()
这个神奇的函数,可以轻松实现你的需求。代码如下代码结束
然后,我再说一下,为什么你用
array_values()
和array_column()
都会使顺序变乱。因为这两个函数都是会重新编号的,而且它编号的顺序,不是你键名的标签顺序,也就是说你键名手动写成0,1,2,3
并不会使它重新编号时候按照0,1,2,3
排序。它重新编号的顺序取决于你代码运行的顺序。也就是说,你最后那个...[0] = $newarr,其实并不是在数组开头,而是在整个数组的尾部,只是它的键名为0而已,所以你无论怎么努力,这个0对应的元素都是会跑到最后的。Update 2
上面代码里注释解说比较多,这里贴一下纯代码:
Update 3
再补充点内容吧,下面是除了
array_column
的几个可行的解决方案。方案1:
这个方案基于你原有代码修改。
在你的代码倒数第二行(
$retlist = ...
上面)加上方案2:
这个方案也是基于你原有代码修改。
将你代码中的
$retlist[0] = $newarr;
改为array_unshift($retlist, $newarr);
上面已经说过,
array_column
和array_values
都会重新编号,重新编号的顺序取决于你定义对应值的顺序,而并非是键名的数字顺序,所以上面这个修改,是用数组头部推入项替代$retlist[0]
的值定义和初始化。方案3:
这个也是基于你代码修改的。
在你遍历之前,先定义好
$retlist[0] = []
,然后当你遍历到符合$makeupId
项的时候,直接赋值给$retlist[0]
,这样,由于事先定义了$retlist[0]
,所以就算重新编号,它的顺序也是在第一个的。是不是这个意思,就是光把键值去掉,相当于把多维数组去掉一层。如果是的话我写了一个大概的例子,你可以照着这个思路去实现一下,上图
json数据最好转换成php数组才好处理。不然很难处理的。