다음과 같은 데이터 구조가 있다고 가정합니다.
array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } }
여기서 “message”와 “action”은 모두 선택 사항입니다. “존재하는지 확인하기 위해 첫 번째 시도는 다음과 같이 작성하는 것입니다.
if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ }
더 깔끔한 구현이 있습니까?
댓글
- 참조 : stackoverflow.com/questions/2948948/ … 재귀 적으로 작동하는 array_key_exists 유틸리티 함수를 작성할 수 있습니다.
Answer
아니요. 그저 그 방법 일뿐입니다.
특정 스크립트 언어에 국한되지 않아도 더 깨끗한 솔루션을 생각할 수 없습니까?
답변
이렇게 할 수 있습니다!
if (isset($array["message"]["action"])) { /*...*/ }
증명 :
<?php error_reporting(E_ALL); ini_set("error_reporting", E_ALL); ini_set("display_errors", 1); $array = [ "id" => 1, "name" => "foo", "message" => [ "action" => "PUT", ], ]; var_dump(isset($array["message"]["action"])); // true $array = [ "id" => 1, "name" => "foo" ]; var_dump(isset($array["message"]["action"])); // false
로그 항목이 없습니다.
값이 null
이면 isset도 false를 반환합니다. “null
로 값을 생성해서는 안됩니다.
댓글
- 이 답변에는
)
도 누락되어 있으며isset($array['message'])
참조를 해제하기 전에 - @Brythan no 로그 항목을 생성하지 않습니다. 하지만 네,
)
가 없습니다. - 죄송합니다. ' 오류보고를 크랭크하십시오. 오류보고가 설정된 경우 절대적으로 로그 항목이 발생합니다. ' 이전에 내 로그를 스팸으로 처리 한 적이 있습니다. 이것은 한 지점에서 기본 로깅이었습니다. 지금은 기본값이 아닐 수 있지만 (또는 호스트가 오류보고를 중단했을 수 있음) 특정 구성에서 로그 항목이 생성 될 수 있다고 확신합니다.
- 아니요 ' 모든 오류보고를 켠 상태에서 테스트하지 않았습니다!
답변
명확하지는 않지만 가장 빠른 솔루션 :
if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ }
일부 값이 isset()
로 평가되기 때문에 두 번째 확인이 필요합니다. 색인이 존재 함에도 불구하고 거짓이됩니다.
답변
내 프로젝트에서 이것을 사용하고 있습니다. m null
를 음소거 상태로 사용합니다. (php 5.6)
<?php function &option_select($options, $default, ...$path) { if(!isset($path[0])) { return $options; } $cursor = &$options; foreach($path as $key) { if(isset($cursor[$key])) { $cursor = &$cursor[$key]; } else { return $default; } } return $cursor; }
트리에서 path
를 조회하는 함수입니다.
echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C");
보시다시피 배열 값을 반복합니다 : path
. 처음에는 검색해야하는 배열에 대한 참조로 커서를 설정합니다. new
키를 찾을 때마다 커서의 참조를 현재 키를 검색하고 있습니다. xdebug
및 좋은 GUI가 있으면 원하는 알고리즘으로 다시 작성할 수 있습니다. isset($cursor[$key])
변경해야합니다. 또는 함수로 삽입 : f($cursor, $key, $default) => (bool)
설명
- 대체 솔루션을 제공했지만 코드를 검토하지 않았습니다. 이것이 OP에 대해 이미 가지고있는 것보다 더 나은 솔루션이 될 수있는 이유에 대한 설명을 추가하십시오.
- 강력하게 입력 된 SirPython이 아니기 때문에 '. 이렇게하면 모든 ' hardcoded-string '에 대해 단위 테스트를 만들지 않고도 단위 테스트로 테스트 할 수 있습니다. 따라서 테스트 가능성과 작업 코드를 작성할 수있는 속도가 필요합니다.
답변
유사한 나 자신을 해결하고 이것을 생각해 냈습니다. 키가 설정되었는지 확인하기 위해 작동하며 “action”키의 값이 NULL 인 경우에도 TRUE를 반환합니다.
if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ }
If $array["message"]
에 키가없는 경우 isset
는 IF 문을 중지하는 FALSE를 반환합니다. $array["message"]
에 키가있는 경우 (NULL 값이있는 키라도) isset
가 TRUE를 반환하므로 "action"
배열 키가 $array["message"]
에 있습니다.