php 객체를 가지고 있는 array 에서 특정 객체 값이 있는 array 키값을 반환 받으려면 어떻게 해야 하나요?
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.2 |
01. Array
(
[0] => stdClass Object
(
[name] => email_address
)
[1] => stdClass Object
(
[name] => nick_name
)
[2] => stdClass Object
(
[name] => signature
)
[3] => stdClass Object
(
[name] => profile_image
)
)
위 데이터에서 특정 키의 객체 값을 변경해야 하는데요.
코드를 짜다보니까 키값이 변경될 경우 대응이 어려우서 객체의 값을 기준으로 배열의 키값을 반환 받고 싶은데요.
$data 가 저 배열을 가지고 있다고 하면
[name] => signature 인 배열의 키값인 2를 반환받고 싶습니다.
댓글 10
키를 가지고 값을 찾는 것은 쉽지만, 값을 가지고 키를 찾는 것은 쉽지 않습니다. array_search 함수가 있지만 사실상 처음부터 끝까지 루프를 돌리면서 원하는 값을 찾는 방식이고, 그나마 숫자나 문자열처럼 간단한 구조가 아닌 오브젝트가 들어 있다면 잘 찾아지지 않아요.
결국 루프 돌리기입니다. ㅡ.ㅡ
그렇게 제작이 어렵다면 어쩔수 없이 반복이고요..ㅠㅠ
몇개 안되니 그냥 루프 돌려서 찾아야 겠습니다.
쿼리를 하시는것이 아니라면 PHP에서 리스트가 만개씩 안되는 이상 반복문 돌릴 때 성능 하락이 크게 없으니 걱정마시고 맘껏 쓰셔도 문제 없습니다.
디비쿼리를 최소화하여 가져온 게시글 리스트를 두번 세번 반복하여 오히려 성능 최적화 하는 사례도 많거든요 (제 사이트의 인스타그램 모듈 기준 최근 성능최적화 했습니다..)
그래서 반복으로 인해 성능이 문제되실것 같다면 큰 걱정 안하셔도 될듯 합니다.
말씀해주신 루프로 확인하는 코드로 완성했습니다. 키값 고정해서 변경될때 마다 코드 수정 안해도 되게 되었네요.
foreach($displayDatas as $key => $val)
{
if($val->name == 'signature')
{
$melist = new stdClass;
$melist->title = Context::getLang('signature');
$melist->value = $show_sign;
$displayDatas[$key] = $melist;
break;
}
}
$val 값이 $melist 로 만드는 항목과 똑같다면, $melist 변수를 만들필요 없이
$val->title = Context::getLang('signature');
$displayDatas[$key] = $val;
이렇게 코드를 확줄일 수 있을 것 같습니다.
사용자가 입력한 서명을 원하는 것으로 필터링(정규식등 이용) 해서 원하는 서명의 형태로
$show_sign
에 담은 다음 운영자가 원하는 필터링 된 서명을 출력해 줄 수 있는 코드의 일부입니다.