2012-02-12 13 views
-1

可能性の重複:
Dynamic array keysPHP動的配列キー

私はネストされている。この

$Values 
    1 
    2 
    3 
    a 
    b 
     c 
    4 

ように設定された配列$値 を持っています。 と私はこのようなキーを持っています:$key = "a"]["b"]["c"; 私は今できるでしょうか:Values[$key]、tiはcの値を得ますか?

@Edit 簡単に言えば、配列$ Values ["a"] ["b"] ["c"]から値を取得したいと思います。私の鍵はどうすればいいのですか?

+6

?あるいは、あなたは、実験するのではなく、スプーンフィードで学ぶことを好むこれらの人々のひとりですか? –

+0

あなたが達成しようとしていることを正確に理解するのは難しいです。 [配列のマニュアルを読む](http://php.net/manual/en/language.types.array.php) – Josh

+0

はい、私はそれを試したが、いいえ、私はスプーンを与えられた人のようなものではない。 – Nealv

答えて

1

ありませんが、あなたは結果を抽出することができます:$キーが有効であれば

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

のみ動作しますが。

今のところ、このようなキーでどのように状況に陥るのですか?実際の問題を説明したなら、ハックではなく本当の答えを与えることができます。

1

いいえ、変数から個々のキーのみを取得できます。実際に何をしたいかによって、配列要素にreferencesを使用することができます。

1

あなたはできません。これは無効な構文です。

ホバーあなたが行うことができます:

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

そしてArrayAccessまたはArrayObject(あなたが$key = 'a,b,c';に固執するだろうLETの方法)を実装しますあなたの配列のようなクラスを実装するよりもを:

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 
} 
関連する問題