就是这个数组,用了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]和array_values都会重新编号,重新编号的顺序取决于你定义对应值的顺序,而并非是键名的数字顺序,所以上面这个修改,是用数组头部推入项替代$retlist[0]的值定义和初始化。
$retlist[0]
这个也是基于你代码修改的。在你遍历之前,先定义好$retlist[0] = [],然后当你遍历到符合$makeupId项的时候,直接赋值给$retlist[0],这样,由于事先定义了$retlist[0],所以就算重新编号,它的顺序也是在第一个的。
$retlist[0] = []
是不是这个意思,就是光把键值去掉,相当于把多维数组去掉一层。如果是的话我写了一个大概的例子,你可以照着这个思路去实现一下,上图
json数据最好转换成php数组才好处理。不然很难处理的。
如果你是要将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]
和array_values
都会重新编号,重新编号的顺序取决于你定义对应值的顺序,而并非是键名的数字顺序,所以上面这个修改,是用数组头部推入项替代$retlist[0]
的值定义和初始化。方案3:
这个也是基于你代码修改的。
在你遍历之前,先定义好
$retlist[0] = []
,然后当你遍历到符合$makeupId
项的时候,直接赋值给$retlist[0]
,这样,由于事先定义了$retlist[0]
,所以就算重新编号,它的顺序也是在第一个的。是不是这个意思,就是光把键值去掉,相当于把多维数组去掉一层。如果是的话我写了一个大概的例子,你可以照着这个思路去实现一下,上图
json数据最好转换成php数组才好处理。不然很难处理的。