kmf*_*mfk 6 php arrays multidimensional-array
这是一个有趣的情况,我创建了一个工作函数,但想知道我是否只有任何人有更简单的方法.
我有以下多维数组:
$foo = array(
[0] => array(
'keys' => array(
'key1' => 1,
'key2' => a,
'key3' => 123
),
'values' => array(
//goodies in here
)
)
[1] => array(
'keys' => array(
'key1' => 1,
'key2' => b,
'key3' => 456
),
'values' => array(
//goodies in here
)
)
)
Run Code Online (Sandbox Code Playgroud)
我想,是转换成基于嵌套一个多维数组此值从keys阵列中,我一直在寻找的输出是:
$bar = array(
[1] => array(
[a] => array(
[123] => array( //values array from above )
),
[b] => array(
[456] => array( //values array from above )
)
)
)
Run Code Online (Sandbox Code Playgroud)
密钥总是可以根据它们在keys数组中的位置进行嵌套,但是它们的密钥并不总是相同,keys处理用户定义的分组,因此顺序和值可以更改.我也不想要重复的密钥.
array_merge失败了,因为在很多情况下,数组键实际上是数字ID.所以,这个功能有效 - 但我想知道我是不是给自己做了一副新手套.
protected function convertAssociativeToMulti( &$output, $keys, $value )
{
$temp = array();
$v = array_values( $keys );
$s = sizeof( $v );
for( $x = 0; $x < $s; $x++ )
{
$k = $v[ $x ];
if ( $x == 0 )
{
if ( !array_key_exists( $k, $output ) )
$output[ $k ] = array();
$temp =& $output[ $k ];
}
if ( $x && ( $x + 1 ) !== $s )
{
if( !array_key_exists( $k, $temp ) )
$temp[ $k ] = array();
$temp =& $temp[$k];
}
if ( ( $x + 1 ) == $s )
$temp[$k] = $value;
}
}
$baz = array();
foreach( $foo as $bar )
{
$this->convertAssociativeToMulti( $baz, $bar['keys'], $bar['values'] );
}
Run Code Online (Sandbox Code Playgroud)
那么,你如何更简单地/重构我所拥有的呢?
这更简洁一些:
$result = [];
foreach($foo as $item)
{
//Start at the outermost level of the result array
$level = &$result;
foreach($item['keys'] as $key)
{
//Add levels to the result array as needed
if(!isset($level[$key])) $level[$key] = [];
//Iterate to the next nested level
$level = &$level[$key];
}
//Append values to the innermost level
foreach($item['values'] as $k => $v) $level[$k] = $v;
}
//Don't keep a reference hanging around
unset($level);
var_dump($result);
Run Code Online (Sandbox Code Playgroud)