【问题标题】:Array containing keys and associative array, how to make a relation包含键和关联数组的数组,如何建立关系
【发布时间】:2012-12-11 22:28:50
【问题描述】:

我有一个数组,其中包含 path 到另一个数组中的特定值,为了更清楚一点,这里是一个例子。

我的数组包含我将调用 $params 的键

Array
(
    [0] => paths
    [1] => assets
    [2] => js
)

这是我的关联数组,我将其称为 $config

Array
(
    [paths] => Array
        (
            [assets] => Array
                (
                    [js] => /assets/js
                    [css] => /assets/css
                )

        )

    [library] => Array
        (
            [js] => jQuery
        )

)

那么我怎样才能使用我的数组 1 来访问我的数组 2 中的值呢?

我试过$config[$params[0]][$params[1]][$params[2]],但是一点效率都没有。

【问题讨论】:

    标签: php arrays key associative-array


    【解决方案1】:

    你可以试试

    $path = array(
            0 => 'paths',
            1 => 'assets',
            2 => 'js',
    );
    
    
    $data = array(
      'paths' => array(
        'assets' => array(
          'js' => '/assets/js',
          'css' => '/assets/css',
        ),
      ),
      'library' => array(
        'js' => 'jQuery',
      ),
    );
    
    
    $temp = $data;
    foreach($path as $key) {
        $temp = $temp[$key];
    }
    
    var_dump($temp);
    

    输出

    string '/assets/js' (length=10)
    

    【讨论】:

    • 不是每次都为$temp 引用(指向$data)赋值时覆盖$data 数组吗?
    【解决方案2】:

    循环应该可以解决您的问题:

    $c = $config;
    foreach($params as $path) {
      if(!array_key_exists($path, $c)) {
        $c = null;
        break;
      }
      $c = $c[$path];
    }
    

    这将遍历$params 中的每个条目,然后访问$config 数组的子键。找到后,$c 将包含当前子数组。最后,$c 将包含您要查找的值(NULL 如果路径无效/未找到)。

    同样可以使用array_reduce函数以函数方式完成:

    $path = array_reduce(function($current, $path) {
      if($current == NULL || !array_key_exists($path, $current))
        return NULL;
    
      return $current[$path];
    }, $params, $config);
    

    【讨论】:

      【解决方案3】:

      嗨,乔纳森,你最后错过了一个大括号 试试这个“$config[$params[0]][$params[1]][$params[2]]”。 它会工作 我发布了一个对我来说很好用的代码

      <?php
      $params = array(0 => 'paths',1 => 'assets',2 => 'js');
      echo '<pre>';print_r($params);
      
      $config = array
      (
          'paths' => array
              (
                  'assets' => array
                      (
                          'js' => '/assets/js',
                          'css' => '/assets/css'
                      )
      
              ),
      
          'library' => array
              (
                  'js' => 'jQuery'
              )
      
      );
      echo '<pre>';print_r($config);
      echo $config[$params[0]][$params[1]][$params[2]];
       ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 2020-01-30
        相关资源
        最近更新 更多