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에 내면 화나 버리므로, 처음부터 심플하게 쓴 처리로 해 둡시다.

좋은 웹페이지 즐겨찾기