예를 들어이 문자열의 요소에서 배열을 만들고 싶습니다.
$str = 'red, green, blue ,orange';
나는 당신이 그들을 폭발하고 반복하고 다룰 수 있다는 것을 알고 있습니다.
$arr = explode(',', $str);
foreach ($arr as $value) {
$new_arr[] = trim($value);
}
그러나 이것을 처리 할 수있는 한 줄 접근법이 있다고 생각합니다. 어떤 아이디어?
답변
array_map을 사용하여 다음을 수행 할 수 있습니다 .
$new_arr = array_map('trim', explode(',', $str));
답변
개선 된 답변
preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red, green thing ,, ,, blue ,orange');
결과:
Array
(
[0] => red
[1] => green thing
[2] => blue
[3] => orange
)
이
- 쉼표로만 분할
- 각 항목에서 공백을 제거합니다.
- 빈 항목을 무시합니다
- “녹색 물건”과 같은 내부 공간으로 항목을 분할하지 않습니다
답변
다음은 또한 입력 문자열의 시작 / 끝에서 공백을 처리합니다.
$new_arr = preg_split('/\s*,\s*/', trim($str));
그리고 이것은 모든 합리적인 위치에 공백이있는 최소 테스트입니다.
$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);
답변
한 줄의 코드로 바꾸고 분해하는 방법
$str = 'red, green, blue ,orange';
$new_string = explode(',',preg_replace('/\s+/', '', $str));
결과를 다음과 같이 출력합니다
Array
(
[0] => red
[1] => green
[2] => blue
[3] => orange
)
답변
기존 답변에 교장 중 일부를 결합하여
preg_split ('/\s*,+\s*/', 'red, green thing ,, ,, blue ,orange', NULL, PREG_SPLIT_NO_EMPTY);
그 이유는 이 답변 에서 버그를 발견 했기 때문에 문자열 끝에 쉼표가 있으면 배열의 빈 요소를 반환합니다. 즉
preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red, green thing ,, ,, blue ,orange,');
결과
Array
(
[0] => red
[1] => green thing
[2] => blue
[3] => orange
[4] => ''
)
이 답변 에서 언급 한대로 PREG_SPLIT_NO_EMPTY 를 사용 하여이 문제 를 제거 하여 해결할 수 있지만 일단 수행하면 기술적으로 정규식을 통해 연속적인 쉼표를 제거 할 필요가 없으므로 표현이 단축됩니다.
답변
한 줄 정규 표현식 으로이 작업을 수행 할 수도 있습니다
preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
답변
이 시도:
$str = preg_replace("/\s*,\s*/", ",", 'red, green, blue ,orange');