从string创建可变长度数组

时间:2012-02-05 00:31:12

标签: php arrays string

字符串

$string = 'a.b.c.d';

应创建一个类似

的数组

array('a' => array('b' => array( ....

我设法得到了这个:

function create_array(&$arr, $string, $data){


  $parts = explode('.', $string);
  $key = array_shift($parts); // first key

  $new_arr = array();
  $have_empty_slot = false;

  if(!isset($arr[$key])){
    $arr[$key] = array();
    $have_empty_slot = true;
  }

  $new_arr = &$arr[$key];

  foreach($parts as $part){
    if(!isset($new_arr[$part])){
      $new_arr[$part] = array();
      $have_empty_slot = true;
    }

    $new_arr = &$new_arr[$part];
  }

  // last one
  if($have_empty_slot)
    $new_arr = $data;

}    


$arr = array('a' => array('aa' => array('aaa' => 555)), 'b' => 55);

create_array($arr, 'c.cc.dd', 4545); // <-- works

create_array($arr, 'a.aa.aa2', 33); // <-- works

create_array($arr, 'a.aa.aaa.aaaaaaa', 4545); // <-- connection closed by remote server lol



print_r($arr);

因此,如果我尝试在现有元素集的最后一个元素之后添加一个新元素,则会因远程服务器错误而关闭该连接。怎么了?

2 个答案:

答案 0 :(得分:1)

这应该有效:

function create_array(&$arr,$string,$data){
    $a=explode('.',$string);
    $last=count($a)-1;
    $p=&$arr;

    foreach($a as $k=>$key){
        if ($k==$last) {
            $p[$key]=$data; 
        } else if (is_array($p)){
            $p[$key]=array();
        }
        $p=&$p[$key];
    }
}

答案 1 :(得分:1)

目前还不太清楚,但如果你只想要你所要求的:

function convertToArray($string)
{
    $pos = strpos($string, '.');
    $key = substr($string, 0, $pos);

    $result = array($key => array());

    if ($pos === false) {
        return array($string=>array());
    } else {
        $result[$key] = convertToArray(substr($string, ($pos+1)));

        return $result;
    }
}

var_dump(convertToArray('a.b.c.d'));

将输出:

array(1) {
  ["a"]=>
  array(1) {
    ["b"]=>
    array(1) {
      ["c"]=>
      array(1) {
        ["d"]=>
        array(0) {
        }
      }
    }
  }
}