如果你是要将JSON转成PHP数组,方法如下

首先,你这个数据格式是JSON的,要先转成PHP数组。

$a = json_decode($a, TRUE);

json_decode第二个参数为TRUE表示保留键名,否则JSON转PHP数组之后,PHP数组的键名会重新排序。

然后将你数据中的$a['data']值用array_column处理,或者使用array_values,将数组值重排。

$a['Data'] = array_column($a['Data'], NULL);

// 或者

$a['Data'] = array_values($a['Data']);

如果你是要将PHP转成JSON,但是要使Data中Data为数组[]。

只要在PHP数组中,先按照上面的array_column或者array_values处理过$a['Data'],然后直接运行

$a = json_encode($a);

注意json_encode第二个参数绝对不能用JSON_FORCE_OBJECT,否则还是会使Data变为对象{}。

Update

看了你的代码,我好像是知道你要干啥了,你是想找出原数组里ID值和$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对应的元素都是会跑到最后的。

Update 2

上面代码里注释解说比较多,这里贴一下纯代码:

$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);

Update 3

再补充点内容吧,下面是除了array_column的几个可行的解决方案。

方案1:

这个方案基于你原有代码修改。

在你的代码倒数第二行($retlist = ...上面)加上

ksort($ret_list, SORT_NUMERIC);

方案2:

这个方案也是基于你原有代码修改。

将你代码中的$retlist[0] = $newarr;改为array_unshift($retlist, $newarr);

上面已经说过,array_column和array_values都会重新编号,重新编号的顺序取决于你定义对应值的顺序,而并非是键名的数字顺序,所以上面这个修改,是用数组头部推入项替代$retlist[0]的值定义和初始化。

方案3:

这个也是基于你代码修改的。

在你遍历之前,先定义好$retlist[0] = [],然后当你遍历到符合$makeupId项的时候,直接赋值给$retlist[0],这样,由于事先定义了$retlist[0],所以就算重新编号,它的顺序也是在第一个的。

php 去掉多维数组的键名,去除多维数组的最外层key 保留值相关推荐

  1. php键名相加,php二维数组相同键名相加实例

    php二维数组相同键名相加实例 导语:在php二维数组雷同键名相加,你写吗?下面的是百分网小编为大家搜集的php二维数组相同键名相加实例,希望对你会有所帮助. Array ( [uid] => ...

  2. php数组排序后保留键名,详解PHP 二维数组排序保持键名不变

    对二维数组指定的键名排序,首先大家想到的是array_multisort函数,关于array_multisort的用法我之前也写了一篇废话不多言,我们看个实例: $data = array( 1001 ...

  3. php 返回数组 键名,php array_keys 返回数组的键名

    array_keys返回数组中部分的或所有的键名 说明 array array_keys ( array $array [, mixed $search_value [, bool $strict = ...

  4. php比较两个数组的键名统计有交集的数量,php比较两个数组的键名并返回交集的函数array_intersect_key()...

    实例 比较两个数组的键名,并返回交集:<?php $a1=array("a"=>"red","b"=>"gree ...

  5. array_combine() - 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值

    一.创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 array_column() 参数 必须 示例 数组的值被作为新数组的键 非法的值将会被转换成字符串类型 是 $a = array( ...

  6. ksort() 对关联数组按照键名升序排序

    实例 对关联数组按照键名进行升序排序: <?php $age=array("Peter"=>"35","Ben"=>&qu ...

  7. php多个数组同键名键值相加合并

    php多个数组同键名键值相加合并 //任意多个相同键值的数组合并相加 //预先将所要合并的数组组装成一个新的数组// $arr = array(// array(// 'user_id' => ...

  8. php某列为键数组为值,PHP 将二维数组中某列值作为数组的键名 -- 超实用

    有时候,想通过数组的中某字段值, 然后再在二维数组中获取存在该字段值的数组: 一般能想到的就是foreach 遍历比较一下跟该字段值一样,就获取到想要的数组,如下: //测试二维数组 $arr =ar ...

  9. php更改二维数组的键,学习猿地-php如何修改二维数组的键名

    php修改二维数组键名的方法:首先将数组[var_export]出来:然后使用数组截取出来再改键名,代码为[array_slice($arr,1,-1);]. php修改二维数组键名的方法: 将数组 ...

最新文章

  1. Winform程序只允许应用单开
  2. dagger2 依赖注入
  3. 跟小静读《jQuery权威指南》——目录
  4. C++中事件机制的简洁实现
  5. P3206 [HNOI2010]城市建设
  6. python 爬虫可视化编程_Python爬虫爬取博客实现可视化过程解析
  7. 初学python的format之美
  8. 从别的网站摘抄的,挺有用的
  9. 从入门到进阶,JAVA书籍的最佳阅读顺序!
  10. 中考计算机表格操作题,中考信息技术Excel操作题.xls
  11. 第三方软件测试环境搭建步骤流程
  12. OpManager-企业网络问题分析及故障排除
  13. HTML基础-02:常用布局
  14. 王的机器第一本书「快乐机器学习」飨你
  15. 【工具】MobaXterm常用设置
  16. ip addr命令解析
  17. cocos2dx lua优化总结
  18. Java连接MySQL数据库并进行简单查询
  19. websocket没准备好如何解决_看完让你彻底搞懂Websocket原理
  20. php和cad,solidworks和cad区别是什么

热门文章

  1. C++ multiset
  2. C++ auto和decltype关键字
  3. ply补全为立方体_PLY文件格式
  4. flowjo软件使用方法_管家婆软件使用方法出库教程,管家婆软件做账流程视频_双全科技...
  5. Python3.x字符串替换方法replace()、maketrans()和translate()
  6. fiddler抓包工具使用技巧
  7. 立志10天学会C++基础应用—day02 代码清晰易懂 涉及数据结构算法的知识 写完了~我也麻了
  8. 20190624 Oracle 表分析
  9. Jmeter之性能测试类型
  10. 上下文信息 RpcContext