【问题标题】:Fill a multi-dimensional array from an array of keys and a single value从键数组和单个值填充多维数组
【发布时间】:2014-04-02 17:21:12
【问题描述】:

有没有一种优雅的方法可以将数组转换为多维键并添加一个值?

$value = "You found the giant!"
$keys = array("fee", "fi", "fo", "fum");

$output[ flipster( $keys ) ] = $value; 
// $output['fee']['fi']['fo']['fum'] = "You found the giant!";

我编写了这个函数,它可以工作并完成我需要它做的事情,但我认为这不是最好的解决方案......

function flipster( $array, $value ) {
    $out = array();
    $key = $array[0];
    array_shift( $array );

    if( count( $array ) > 0 ) {
        $out[ $key ] = flipster( $array, $value );  
    } else {
        $out[ $key ] = $value;
    }

    return $out;
}

最后,我从一个循环中得到了我的“fee”和“fi”,所以在循环中我正在做这样的事情来创建一个新数组:

$out = array_merge_recursive($out, flipster( $keys, $value ) );

【问题讨论】:

    标签: php arrays multidimensional-array flip


    【解决方案1】:
    function flipster( array &$target, array $keys, $value ) {
        if(empty($keys)){
            return false;
        }
    
        $ref = &$target;
        foreach($keys as $key){
            if(!isset($ref[$key])){
                $ref[$key] = array();
            }
            $ref = &$ref[$key];
        }
        $ref = $value;
    
        return true;
    }
    
    $bucket = array();
    flipster($bucket, array('x', 'y', 'z'), 'test1');
    flipster($bucket, array('x', 'y', 'a'), 'test2');
    flipster($bucket, array('a', 'b', 'c'), 'test3');
    flipster($bucket, array('a', 'b', 'd'), 'test4');
    flipster($bucket, array('a', 'c', 'e'), 'test5');
    var_dump($bucket);
    

    试穿它的大小。可以将多个翻转组合成同一个array()。使您可以轻松构建深度数组树。 它使用引用来构建深度数组,而不是递归函数。

    【讨论】:

      【解决方案2】:

      如何使用递归:

      function flipster( $arr, $value ) {
          if(count($arr)==1){
              return array($arr[0] => $value);
          }
      
          return array(array_shift($arr) => flipster( $arr, $value ));
      }
      $value = "You found the giant!";
      $keys = array("fee", "fi", "fo", "fum");
      
      $output = flipster( $keys, $value );
      echo $output["fee"]["fi"]["fo"]["fum"];
      

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多