Php 将关联数组转换为具有值的多维数组
这是一个有趣的情况,我为它创建了一个工作函数,但我想知道是否有人有更简单的方法来实现这一点 我有以下多维数组:Php 将关联数组转换为具有值的多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,这是一个有趣的情况,我为它创建了一个工作函数,但我想知道是否有人有更简单的方法来实现这一点 我有以下多维数组: $foo = array( [0] => array( 'keys' => array( 'key1' => 1, 'key2' => a, 'key3' => 123 ), 'values' => 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
)
)
)
我想要的是将其转换为一个多维数组,该数组基于键数组中的值嵌套,我想要的输出是:
$bar = array(
[1] => array(
[a] => array(
[123] => array( //values array from above )
),
[b] => array(
[456] => array( //values array from above )
)
)
)
键始终可以根据它们在keys
数组中的位置进行嵌套,但键本身并不总是相同的,keys
处理用户定义的分组,因此顺序和值可以更改。我也不想要重复的钥匙
array\u merge
我失败了,因为在很多情况下,数组键实际上是数字ID。所以,这个函数可以工作——但是我想知道我是否为自己做了一双新的
受保护的函数convertAssociateveToMulti(&$output,$keys,$value)
{
$temp=array();
$v=数组_值($key);
$s=尺寸(v美元);
对于($x=0;$x<$s;$x++)
{
$k=$v[$x];
如果($x==0)
{
如果(!array_key_存在($k,$output))
$output[$k]=array();
$temp=&$output[$k];
}
如果($x&($x+1)!=$s)
{
如果(!array_key_存在($k,$temp))
$temp[$k]=array();
$temp=&$temp[$k];
}
如果($x+1)=$s)
$temp[$k]=$value;
}
}
$baz=array();
foreach($foo作为$bar)
{
$this->convertAssociateveToMulti($baz,$bar['keys'],$bar['values']);
}
那么,如何更简单地实现这一点/重构我所拥有的?这一点更简洁(请参见实际操作):
+1有关同谋者手套的链接
!看看我的答案,我认为它们很相似。@Barmar-相似。我认为该解决方案缺乏为我的用例维护适当的层次结构。由于我循环了多个键
数组,它们都嵌套在最后一组代码下面。是的,这解释了为什么我的代码要短得多。它只处理一个条目,而不是像您这样的数组。很有趣。我之前尝试过array\u merge
,因为我认为这会大大简化这个过程。我想我遇到了一个数字键被更改的问题。。。根据文档:带有数字键的输入数组中的值将在结果数组中用从零开始递增的键重新编号。
不管怎样,我明白了。谢谢,用我的代码进行了测试。我不得不放弃数组合并
无论如何,我的示例显示值是数组,它实际上是一个对象-无论哪种方式,都要简洁得多。哎呀,我忘记了数组合并。实际上,根据我在问题中给出的信息,你的数组合并是很好的,因为你只是将值
合并到空数组中。当我早些时候尝试它时,我实际上是在尝试合并类似的键。再次感谢
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'] );
}
$bar=array();
foreach($foo as $item)
{
$out=&$bar;
foreach($item['keys'] as $key)
{
if(!isset($out[$key])) $out[$key]=array();
$out=&$out[$key];
}
foreach($item['values'] as $k=>$v) $out[$k]=$v;
// $out=array_merge($out,$item['values']); -- edit - fixed array_merge
}
var_dump($bar);