PHP动态数组键

时间:2012-02-12 17:38:03

标签: php arrays dynamic

  

可能重复:
  Dynamic array keys

我有一个数组$ Values 这是像这样设置的

$Values
  1
  2
  3
  a
    b
      c
  4

是嵌套的。 我有一个这样的键:$key = "a"]["b"]["c"; 我现在可以这样做:Values[$key],ti获取c中的值吗?

@Edit 简单地说:我想从数组中获取值$ values [“a”] [“b”] [“c”]通过$ values [$ key]。那我的钥匙应该是什么?

3 个答案:

答案 0 :(得分:2)

不,你只能从变量中获取个别密钥。根据您真正想要做的事情,您可以对数组元素使用references

答案 1 :(得分:2)

不,但您可以提取结果:

$Values = array( '1' => 'ONE',
                 '2' => 'TWO',
                 '3' => 'THREE',
                 'a' => array( 'b' => array( 'c' => 'alphabet') ),
                 '4' => 'FOUR'
               );

$key = '"a"]["b"]["c"';

$nestedKey = explode('][',$key);
$searchArray = $Values;
foreach($nestedKey as $nestedKeyValue) {
    $searchArray = $searchArray[trim($nestedKeyValue,'"')];
}

var_dump($searchArray);

仅在$ key有效时才有效。

现在你怎么会遇到像这样的钥匙呢?也许如果你解释了真正的问题,我们可以给你一个真正的答案而不是黑客。

答案 2 :(得分:2)

不,你不能。这是无效的语法。

您可以执行以下操作:

$key = 'a,b,c';
// or:
$key = serialize( array( 'a','b', 'c'));
// or many other things

而不是实现类似数组的类,它将实现ArrayAccessArrayObject(让我们坚持使用$key = 'a,b,c';):

class MyArray extends ArrayAccess {

protected $data = array();

protected &_qetViaKey( $key, &$exists, $createOnNonExisting = false){
  // Parse keys
  $keys = array();
  if( strpos( $key, ',') === false){
    $keys[] = $key;
  } else {
    $keys = explode( ',', $key);
  }

  // Prepare variables
  static $null = null;
  $null = null;
  $exists = true;

  // Browse them
  $progress = &$this->data;
  foreach( $keys as $key){
      if( is_array( $progress)){
         if( isset( $progress[ $key])){
            $progress = $progress[ $key];
         } else {
            if( $createOnNonExisting){
               $progress[ $key] = array();
               $progress = $progress[ $key];
            } else {
               $exists = false;
               break;
            }
         }
      } else {
          throw new Exception( '$item[a,b] was already set to scalar');
      }
  }

  if( $exists){
      return $progress;
  }
  return $null;
}

public offsetExists( $key){
    $exists = false;
    $this->_getViaKey( $key, $exists, false);
    return $exists;
}

// See that we aren't using reference anymore in return
public offsetGet( $key){
    $exists = false;
    $value = $this->_getViaKey( $key, $exists, false);
    if( !$exists){
       trigger_error( ... NOTICE ...);
    }
    return $value;
}

public offsetSet ( $key, $val){
    $exists = false;
    $value = $this->_getViaKey( $key, $exists, true);
    $value = $val;
}

}

// And use it as:
$array = MyArray();
$array['a']['b']['c'] = 3;
$array['a,b,c'] = 3;

或实现功能:

public function &getArrayAtKey( $array, $key){
    // Similar to  _qetViaKey
    // Implement your own non existing key handling
}