애드온 수정중 explode 사용 방법 관련 질문 드립니다.
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 5.x |
애드온 수정중입니다..
애드온에서 입력받은 값 (list)
감자(123)
라이믹스(442)
감귤(663)
이라고 할 때
$list = explode("\r\n", $addon_info->list);
로 하게 될 경우
list 배열에 감자(123), 라이믹스(442) ... 식으로 배열이 나눠지는건 알고있는데..
코드를 잘 못봐서 아무리 구글링해도 못찾겠어서 여기서.. 질문드립니다.
제가 하고싶은건
list 배열안에
list->name = 감자
list->code = 123
이렇게 괄호 안 숫자를 또 따로 빼서 이름과 숫자로 배열을 나눠서 저장하고싶은데요
다른분 코드를 봐도 이해가 안가는 제가 답답하지만..
혹시 도움 주실 분 있으실까요 ㅠㅠ
댓글 7
잘못된 부분이 있을까요??
정확히 어떤 형태의 결과를 원하시는지 모르겠네요.
$list는 배열이라고 말씀하셨는데, $list->name과 $list->code는 객체에 쓰는 문법이니...
배열 안에 여러 개의 객체를 담고 싶으신 건가요?
몇 가지 힌트를 드리자면
1. '감자(123)'이라는 문자열을 '('를 기준으로 한 번 더 explode하고,
맨 뒤의 ')'를 지워주면 '감자'와 '123'으로 분리할 수 있습니다.
정규식 써서 처리하는 방법도 있겠지만 아마 이게 더 직관적일 거예요.
2. 배열에 들어 있는 것들을 어떤 형태로든 변환해서 다시 배열에 담으려면
기존 배열을 가지고 루프를 돌리면서 변환된 결과를 하나씩 새 배열에 추가한 후,
기존 배열을 새 배열로 바꿔치기하는 방법이 가장 간단합니다.
3. 줄바꿈이 \r\n이라는 법은 없습니다. \n만 들어오는 경우도 꽤 많아요.
제가 다른분 애드온에서 비슷한게 있어서 찾아보고 수정해보았는데요..
코드를 잘 모르다보니
$list = explode("\r\n", $addon_info->list);
foreach($list as $list2)
{
$sp = explode('(', $list2);
$name = $sp[0];
$code_r = explode(')', $sp[1]);
$code = $code_r[0];
$args->name = $name;
$args->code = $code;
$list_list[] = $args;
}
Context::set('list_list', $list_list);
이렇게 애드온에서 저장을 해주고
템플릿에서 {print_r($list)} 해서 뿌려보니
제일 마지막 줄만 계속 반복되서 나옵니다..
혹시 수정해야 할 부분이 있을까요??
Array 값이 [0] 부터 ~ [3] 까지 있다고 쳐도
제일 마지막 줄 값만 나오더라구요..
$args를 초기화하지 않고 계속 재사용하고 있기 때문에 모든 값이 똑같아집니다.
name과 code를 넣기 전에 $args = new stdClass; 초기화 선언해 주세요.
최신 트릭을 총동원하여 최대한 짧게 코드를 쓰자면
$list = array_map(function($item) {
preg_match('/^(.+)\(([^)]+)\)/', trim($item), $m);
return (object)['name' => $m[1], 'code' => $m[2]];
}, explode("\n", $addon_info->list));
뭐 이런 식으로도 가능하기는 합니다. 유지보수는 포기하는 걸로... ㅋㅋㅋ