【问题标题】:Create variable length array from string从字符串创建可变长度数组
【发布时间】:2012-02-05 00:31:12
【问题描述】:

字符串

$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);

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

【问题讨论】:

  • 什么是$arr,那个数字是多少(第三个参数)?
  • 第三个参数不重要,就是最后一个子元素的值

标签: php arrays string


【解决方案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];
    }
}

【讨论】:

    【解决方案2】:

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

    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) {
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多