2010-08-23 6 views
2

I가 기본적으로 같은과 같은 일부 설정을 포함하는 하나 개의 배열 : 다른 파일에중첩 배열은 키 만 문자열을 가진 내부 값을 찾기

 
$defaults = array(
    'variable' => 'value', 
    'thearray' => array(
        'foo' => 'bar' 
        'myvar' => array('morevars' => 'morevalues'); 
       ); 
); 

, 내가 처음으로 문자열을 얻을 수를 레벨 키가 있고 값이 첨부되어 있는지 확인하는 하위 항목입니다. 위의 배열을 사용하여, 나는 이런 식으로 뭔가를 얻을 것 : 나는 또한 데이터베이스와 데 저장 다른 함수에 전달해야하기 때문에

 
$option = "thearray['myvar']['morevars']"; 

내가 위의 유사한 형식이 문자열을 계속해야합니다 그것은 배열의 형식으로 편리합니다.

내 질문은 배열과 위의 문자열을 가지고 어떻게 배열 내에서 주어진 키의 존재 여부와 값을 모두 확인할 수 있습니까? array_key_exists가 첫 번째 레벨 아래에서 작동하지 않는 것 같습니다.

답변

1

간단한 함수를 사용하여 키 문자열을 구문 분석하고 다음과 같이 배열을 검사 할 수 있습니다.

function array_deep_exists($array, $key) 
{ 
    $keys = preg_split("/'\\]|\\['/", $key, NULL, PREG_SPLIT_NO_EMPTY); 
    foreach ($keys as $key) 
    { 
     if (! array_key_exists($key, $array)) 
     { 
      return false; 
     } 
     $array = $array[$key]; 
    } 

    return true; 
} 

// Example usage 
$defaults = array(
    'variable' => 'value', 
    'thearray' => array(
     'foo' => 'bar', 
     'myvar' => array('morevars' => 'morevalues') 
    ) 
); 
$option = "thearray['myvar']['morevars']"; 
$exists = array_deep_exists($defaults, $option); 
var_dump($exists); // bool(true) 

마지막으로 값이있는 경우 $array을 반환합니다. 여기서 true을 반환합니다.

배열에 false이 포함될 수있는 경우 값을 반환 할 때 일치하지 않는 값과 성공적인 false 값을 구별하는 데주의해야합니다.

+0

그 작품, 고마워. 나는 그것이 정확히 문자열의 형식에 따라 다르다는 것을 좋아하지는 않지만 그 것이 문제의 본질이라고 생각한다. 거짓 값 문제를 발견했으나 어쨌든 0 값을 사용하므로 문제가되지 않습니다. – BioXD

+0

원하는 경우 문자열 형식에 따라 다릅니다. 키 목록을 할당하는 코드를 변경하면 다른 형식을 사용할 수 있습니다. – salathe

-1

당신은 eval이 코드가 필요하고, 평가 후면 문자열에 isset 기능을 사용하여 코드를 평가하기 전에 올바른 장소에 $ 문자를 추가하는 것을 잊지 마세요

예 :

eval("echo isset(\$defaults['varname']['varname2']);") 

이 의지 echo 0 또는 1 (false 또는 true) PHP 소스처럼 eval에서 무엇이든 할 수 있습니다.

+0

가능하면 항상 외부 소스에서 데이터를 처리 할 때는 매우 심각한 보안 위험 (코드 삽입 가능성)이 있으므로 나쁜 해결책입니다. – Frxstrem

+0

나는 그것이 나쁜 해결책 인 것을 안다. 그러나 질문에서 예증 된 상황은 일을하는 더욱 나쁜 기술이다. 그런 식으로 끝났다면, 나는 그것이 purpe에 의해 끝났다고 가정하고, 이런 종류의 프로그래밍의 위협이 무엇인지 알 것이다 ... solution i 그냥 작품 제안, 완벽한 하나가되지 않을 수도 있습니다 ... – canni

관련 문제