다차원 배열에서 기존 키 확인

다음과 같은 데이터 구조가 있다고 가정합니다.

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"])){ } 

더 깔끔한 구현이 있습니까?

댓글

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"]에 있습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다