如何用CakePHP 2 Hash函数将嵌套数组转为指定索引数组?
用CakePHP 2的Hash函数重组嵌套数组
首先明确你的需求:你有这样一个嵌套数组作为输入:
array ( 0 => array ( 22 => 'One string' ), 1 => array ( 8 => 'Another string' ) )
想要转换成以子数组的键(22、8)作为顶层索引的目标数组:
array ( 22 => 'One string', 8 => 'Another string' )
你之前尝试用Hash::nest没得到预期结果,这很正常——因为Hash::nest是用来把带parent_id这类字段的扁平树形数据转换成嵌套树形结构的,和你当前的需求完全不匹配,所以才会出现奇怪的输出。
其实有几种简单的方法可以实现你的目标:
方法1:用Hash::merge结合call_user_func_array
你的每个子数组都是单个键值对,直接把所有子数组合并起来就能得到目标结果:
$originalArray = array( array(22 => 'One string'), array(8 => 'Another string') ); $result = call_user_func_array('Hash::merge', $originalArray);
call_user_func_array会把$originalArray里的每个子数组作为参数传给Hash::merge,最终合并成你想要的结构。
方法2:循环遍历合并
如果觉得上面的写法有点抽象,也可以用更直观的循环逐个合并:
$result = array(); foreach ($originalArray as $item) { $result = Hash::merge($result, $item); }
每次把一个子数组合并到结果数组里,最终就能得到目标结构。
方法3:用Hash::reduce
CakePHP的Hash::reduce可以迭代处理数组,这里也能派上用场:
$result = Hash::reduce($originalArray, function($carry, $item) { return Hash::merge($carry, $item); }, array());
匿名函数会把每个子数组合并到初始为空的$carry变量里,最终返回合并后的数组。
这几种方法都能得到你想要的目标数组,选哪种都可以,看你觉得哪种更易读~
内容的提问来源于stack exchange,提问作者Ângelo Rigo
相关产品推荐
相关产品推荐

