2012-02-12 7 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"] $ Values ​​[$ key]를 사용하면 배열로부터 값을 가져오고 싶습니다. 그러면 내 열쇠는 무엇이되어야합니까?

+6

뭐야? 아니면 실험보다는 숟가락 먹이로 배우는 것을 좋아하는 사람입니까? –

+0

정확히 무엇을 성취하려고하는지 이해하기 어렵습니다. [배열에 대한 매뉴얼을 읽어보십시오] – 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'; 맡기 겠소하자 방식)를 구현됩니다 배열과 같은 수준의 구현보다 :

호버 당신은 할 수

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 
}