代码之家  ›  专栏  ›  技术社区  ›  TheDeadMedic

从数组值按键路径设置多维数组?

  •  4
  • TheDeadMedic  · 技术社区  · 14 年前

    array('this', 'is', 'the', 'path')

    使用下面的数组最有效的方法是什么?

    array(
        'this' => array(
            'is' => array(
                'the' => array(
                    'path' => array()
                )
            )
        )
    )
    
    5 回复  |  直到 14 年前
        1
  •  6
  •   MediaVince siliconrockstar    10 年前

    只需使用array\u shift或array\u pop之类的方法对其进行迭代:

    $inarray = array('this', 'is', 'the', 'path',);
    $tree = array();
    while (count($inarray)) {
        $tree = array(array_pop($inarray) => $tree,);
    }
    

    没有测试,但这是它的基本结构。递归也很适合这个任务。

    $inarray = array('this', 'is', 'the', 'path',);
    $result = array();
    foreach (array_reverse($inarray) as $key)
        $result = array($key => $result,);
    
        2
  •  6
  •   Venkat D.    12 年前

    我使用两个类似的函数通过数组中的路径获取和设置值:

    function array_get($arr, $path)
    {
        if (!$path)
            return null;
    
        $segments = is_array($path) ? $path : explode('/', $path);
        $cur =& $arr;
        foreach ($segments as $segment) {
            if (!isset($cur[$segment]))
                return null;
    
            $cur = $cur[$segment];
        }
    
        return $cur;
    }
    
    function array_set(&$arr, $path, $value)
    {
        if (!$path)
            return null;
    
        $segments = is_array($path) ? $path : explode('/', $path);
        $cur =& $arr;
        foreach ($segments as $segment) {
            if (!isset($cur[$segment]))
                $cur[$segment] = array();
            $cur =& $cur[$segment];
        }
        $cur = $value;
    }
    

    然后你像这样使用它们:

    $value = array_get($arr, 'this/is/the/path');
    $value = array_get($arr, array('this', 'is', 'the', 'path'));
    array_set($arr, 'here/is/another/path', 23);
    
        3
  •  1
  •   nathan    14 年前
    function buildArrayFromPath( $path ) {
      $out = array();
      while( $pop = array_pop($path) ) $out = array($pop => $out);
      return $out;
    }
    
        4
  •  1
  •   Tomalak    14 年前

    function find_in_array(&$array, &$path, $_i=0) {
      // sanity check
      if ( !(is_array($array) && is_array($path)) ) return false;
      $c = count($path); if ($_i >= $c) return false;
    
      $k = $path[$_i];
      if (array_key_exists($k, $array))
        return ($_i == $c-1) ? $array[$k] : find_in_array($array[$k], $path, $_i+1);
      else
        return false;
    }
    

    参数 $_i

        5
  •  0
  •   bindo    14 年前

    不是很优雅。但它是有效的

    $start=array('this'、'is'、'the'、'path')