首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将关联数组转换为具有值的多维数组

将关联数组转换为具有值的多维数组
EN

Stack Overflow用户
提问于 2013-01-25 02:05:25
回答 1查看 3.4K关注 0票数 6

这是一个有趣的情况,我创建了一个工作函数,但不知道是否有人有更简单的方法来解决这个问题。

我有以下多维数组:

代码语言:javascript
运行
复制
$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
        )
    )
)

我想要的是将它转换为一个基于来自数组的值的多维数组,我正在寻找的输出是:

代码语言:javascript
运行
复制
$bar = array(
    [1] => array(
        [a] => array(
            [123] => array( //values array from above )
        ),
        [b] => array(
            [456] => array( //values array from above )
        )
    )
)

键可以根据其在keys数组中的位置进行嵌套,但它们本身并不总是相同的,keys处理用户定义的分组,因此顺序和值可以更改。我也不想要重复的钥匙。

array_merge失败了,因为在很多情况下,数组键实际上是数字ids。因此,这个函数可以工作-但我想知道我是否为自己做了一双新的手套

代码语言:javascript
运行
复制
   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'] );
   }

那么,如何更简单地/重构我所拥有的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-25 05:36:11

这一点更简洁一些(参见实际操作这里):

代码语言:javascript
运行
复制
$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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14514198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档