【问题标题】:Get value from multiple dimension associative array in Php从 PHP 中的多维关联数组中获取值
【发布时间】:2014-06-07 14:21:02
【问题描述】:

我有一个如下所示的 POST 请求数组

 $request = array (size=2)
      'licence' => string 'uDyQwFwqV7aQG2z' (length=15)
       'user' => 
         array (size=7)
           'first_name' => string 'Danut' (length=5)
           'last_name' => string 'Florian' (length=7)
           'username' => string 'daniesy9' (length=8)
           'password' => string '123456' (length=6)
           'rpassword' => string '123456' (length=6)
           'email' => string 'daniesy+1@me.com' (length=16)
           'phone' => string '9903131' (length=7)

这实际上是一个数组,表示表单发送的值。我知道元素的名称,例如用户名输入的名称为user[username],我必须按名称从数组中找到相关值。比如:

$key = "user[username]";
$request[key];

知道怎么做吗?

我知道正确的做法是$request["user"]["username"],但它非常复杂,因为我必须使用表单中的字段名称user[username], user[firstname], etc,并且它可能有多达 4 个级别的深度。

【问题讨论】:

标签: php arrays associative


【解决方案1】:

在 cmets 中回答但与以下类似的问题 Convert a String to Variable

eval('$username = $request["user"]["username"];');

编辑

评估不是作为请求数据的有效建议。

所以我会在这篇文章中建议第二种方法

<?php
$request = array(
    'user' => array(
        'username' => 'joe_blogs'
    )
);

function extract_data($string) {
    global $request;

    $found_matches = preg_match_all('/\[\"([a-z]+)\"\]/', $string, $matches);
    if (!$found_matches) {
            return null;
    }

    $current_data = $request;
    foreach ($matches[1] as $name) {
            if (key_exists($name, $current_data)) {
                    $current_data = $current_data[$name];
            } else {
                    return null;
            }
    }

    return $current_data;
} 

$username = extract_data('request["user"]["username"]');
?>

【讨论】:

  • 问题是我只有像user[username] 这样的字符串,我应该用它们从数组中提取值。另外,作为请求数据的表单,eval 不是很危险吗?
  • 是的,抱歉没有考虑到这一点
  • 我已经更新了你想让我只为用户[用户名]更新它吗?
  • 不不,没关系!谢谢。我想我也有解决办法
  • 对不起,我觉得我的答案更好
【解决方案2】:
function findInDepth($keys, $array){
    $key = array_shift($keys);
    if(!isset($array[$key])){
        return FALSE;
    }
    if(is_array($array[$key])){
        return findInDepth($keys, $array[$key]);
    }
    return $array[$key];
}
$key = "user[username]";
$keys = preg_split("/(\[|\])/", $key);
echo findInDepth($keys, $request);

这个功能解决了我的问题。它首先将字符串(也就是输入名称)拆分为一个键数组,然后通过键隐性地搜索该数组,直到找到一个不是数组的值,否则返回FALSE

【讨论】:

    【解决方案3】:

    您可以用点分隔键。原始示例:

    <?php
    
    class ArrayDot
    {
      protected $array = [];
      public function __construct(array $array) {$this->array = $array;}
    
      public function get($path)
      {
        $array = $this->array;
        foreach(explode('.', $path) as $key)  {
          $array = $array[$key];
        }
        return $array;
      }
    }
    
    $array = [
      'user' => [
        'username' => 'tootski',
      ]
    ];
    
    $a = new ArrayDot($array);
    
    echo $a->get('user.username'); # tootski
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多