php로 [0,...10]까지의 배열을 2개, 3개, 2개……가 되도록 array_chunk하려고 하면 힘들게 되었다
화면상의 열의 구성이 1행째는 2개, 2행째는 3개……같다.
CSS로 대응할 수 없는 일도 없습니다만, PHP측에서 그러한 대응이 필요하게 되어 버렸을 경우에.
2개씩, 3개씩이라는 것이라면 array_chunk 한발로 간단했습니다만…
우선은 심플하게!
simple_chunk.php$azunyan = range(0, 10);
$peropero = [];
while (count($azunyan)) {
$peropero[] = array_splice($azunyan, 0, count($peropero) % 2 ? 3 : 2);
}
// [[0,1], [2,3,4], [5,6], [7,8,9], [10]]
var_dump($peropero);
간단하게 구현해 보았습니다.
2개, 3개가 되도록 array_splice에 건네주는 값을 제어하고 있습니다.
원시 PHP로 할 수 있다면 이것이 정상이라고 생각합니다.
불타는 반골심
뭘 미쳤는지,\$azunyan을 준비하고 싶지 않아,
\$peropero의 빈 배열 변수도 미리 준비하고 싶지 않으며,
[]로 연결하고 싶지 않다는 반골심이 태어났습니다! !
yield 해 보자!
yield_chunk.php$peropero = iterator_to_array((function ($values) {
while (count($values)) {
yield array_splice($values, 0, 2);
if (count($values)) yield array_splice($values, 0, 3);
}
})(range(0, 10)));
var_dump(var_dump);
$peropero에 수시로 추가하지 않게 한다면, 2개, 3개…
하지만 함수라면 결국, 내부에서 변수를 정의해 처리하지 않으면 안 되는 것 같구나… 라는 발상으로부터 탄생한 코드가 됩니다.
이것으로도 분할은 할 수 있습니다만, while 안에서 조건 분기를 할 수 없게 되어 버렸기 때문에,
yield가 2단계 구성+if문이 필요하게 되고, 행도 증가해 버린다는 이마이치한 만들기에.
줄은 줄이고 싶고 if도 쓰고 싶지 않아!
chunk_splice_merge.php$peropero = call_user_func_array("array_merge", array_map(function($target) {
return array_filter([array_splice($target, 0, 2), $target]);
}, array_chunk(range(0, 10), 5)));
var_dump($peropero);
줄은 줄이고 싶고 if도 쓰고 싶지 않다는 사치스러운 조건을 충족해 보았습니다.
2개, 3개……라는 흐름으로 한다면…
우선 5개씩 분할하고, 그것을 더 2개, 3개로 분할하고, 최종적으로 flat하면 좋지 않을까 하는 결론에.
flat하는 함수가 원시의 php에서는 존재하지 않는다는 사실에 마음이 부러졌습니다만,
javascript에서 말하는 스프레드 연산자적인 것이 있으면, array_merge로 2차원을 1차원으로 떨어뜨릴 수 있다고.
call_user_func_array의 존재를 기억하고, array_merge로 부르고 있습니다.
yield 때 문제가 된 if 문은 array_filter를 실행하여 제거하도록합니다.
결론!
이런 보기 어려운 처리를 pr에 내면 화나 버리므로, 처음부터 심플하게 쓴 처리로 해 둡시다.
Reference
이 문제에 관하여(php로 [0,...10]까지의 배열을 2개, 3개, 2개……가 되도록 array_chunk하려고 하면 힘들게 되었다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fumihiko-hidaka/items/3f6d35a8998ca5892091
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$azunyan = range(0, 10);
$peropero = [];
while (count($azunyan)) {
$peropero[] = array_splice($azunyan, 0, count($peropero) % 2 ? 3 : 2);
}
// [[0,1], [2,3,4], [5,6], [7,8,9], [10]]
var_dump($peropero);
뭘 미쳤는지,\$azunyan을 준비하고 싶지 않아,
\$peropero의 빈 배열 변수도 미리 준비하고 싶지 않으며,
[]로 연결하고 싶지 않다는 반골심이 태어났습니다! !
yield 해 보자!
yield_chunk.php
$peropero = iterator_to_array((function ($values) {
while (count($values)) {
yield array_splice($values, 0, 2);
if (count($values)) yield array_splice($values, 0, 3);
}
})(range(0, 10)));
var_dump(var_dump);
$peropero에 수시로 추가하지 않게 한다면, 2개, 3개…
하지만 함수라면 결국, 내부에서 변수를 정의해 처리하지 않으면 안 되는 것 같구나… 라는 발상으로부터 탄생한 코드가 됩니다.
이것으로도 분할은 할 수 있습니다만, while 안에서 조건 분기를 할 수 없게 되어 버렸기 때문에,
yield가 2단계 구성+if문이 필요하게 되고, 행도 증가해 버린다는 이마이치한 만들기에.
줄은 줄이고 싶고 if도 쓰고 싶지 않아!
chunk_splice_merge.php
$peropero = call_user_func_array("array_merge", array_map(function($target) {
return array_filter([array_splice($target, 0, 2), $target]);
}, array_chunk(range(0, 10), 5)));
var_dump($peropero);
줄은 줄이고 싶고 if도 쓰고 싶지 않다는 사치스러운 조건을 충족해 보았습니다.
2개, 3개……라는 흐름으로 한다면…
우선 5개씩 분할하고, 그것을 더 2개, 3개로 분할하고, 최종적으로 flat하면 좋지 않을까 하는 결론에.
flat하는 함수가 원시의 php에서는 존재하지 않는다는 사실에 마음이 부러졌습니다만,
javascript에서 말하는 스프레드 연산자적인 것이 있으면, array_merge로 2차원을 1차원으로 떨어뜨릴 수 있다고.
call_user_func_array의 존재를 기억하고, array_merge로 부르고 있습니다.
yield 때 문제가 된 if 문은 array_filter를 실행하여 제거하도록합니다.
결론!
이런 보기 어려운 처리를 pr에 내면 화나 버리므로, 처음부터 심플하게 쓴 처리로 해 둡시다.
Reference
이 문제에 관하여(php로 [0,...10]까지의 배열을 2개, 3개, 2개……가 되도록 array_chunk하려고 하면 힘들게 되었다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fumihiko-hidaka/items/3f6d35a8998ca5892091
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(php로 [0,...10]까지의 배열을 2개, 3개, 2개……가 되도록 array_chunk하려고 하면 힘들게 되었다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fumihiko-hidaka/items/3f6d35a8998ca5892091텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)