Introduction
API DOCS

ArrayUtils은 배열을 관리하는 더 좋은 방법을 제공하는 PHP 라이브러리입니다.

 

PHP의 내장 배열 함수들은 개발자에게 여러가지 고통을 주죠.

  • 일부 함수는 결과를 반환하지만, 일부는 참조 변수를 수정한다.
$arr = array_slice($arr);
//-----------------------
asort($arr);
  • 함수마다 매개변수의 순서가 다르다.
array_filter($arr, $callback);
//-----------------------
array_map($callback, $arr);
  • 함수이기 때문에 코드가 분리된다.
  • someevery같은 배열을 사용하는 최신 기능이 없다.

 

위와 같은 문제를 해결하고 js-array와 같은 코드 흐름을 만들기 위해 이 라이브러리를 만들었습니다.


간단하게 코드의 차이를 보여드리자면

Pure PHP

$playerFiles = scandir(Server::getInstance()->getDataPath() . "players/";
$onlinePlayers = Server::getInstance()->getOnlinePlayers();

$onlineNames = array_column(
    array_map(
        function(Player $player) : array{ return [strtolower($player->getName()), $player->getName()]; },
        $onlinePlayers
    ), 1, 0
);
$playerNames = array_column(
    array_map(
        function(string $playerName) : array{ return [strtolower($playerName), $playerName]; },
        array_map(
            function(string $playerName) use($onlineNames) : string{ return $onlineNames[strtolower($playerName)] ?? $playerName; },
            array_map(
                function(string $fileName) : string{ return substr($fileName, 0, -strlen(\".dat\")); },
                array_filter($playerFiles, function(string $fileName) : bool{ return substr($fileName, -strlen(\".dat\")) === \".dat\"; })
            )
        )
    ), 1, 0
);

with ArrayUtils

use kim\present\utils\arrays\ArrayUtils;

$playerFiles = scandir(Server::getInstance()->getDataPath() . "players/");
$onlinePlayers = Server::getInstance()->getOnlinePlayers();

$onlineNames = ArrayUtils::mapAssocFromAs($onlinePlayers, function(Player $player) : array{ return [strtolower($player->getName()), $player->getName()]; });
$playerNames = ArrayUtils::filterFrom($playerFiles, function(string $fileName) : bool{ return substr($fileName, -strlen(".dat")) === ".dat"; }) 
    ->map(function(string $fileName) : string{ return substr($fileName, 0, -strlen(".dat")); })
    ->map(function(string $playerName) use($onlineNames) : string{ return $onlineNames[strtolower($playerName)] ?? $playerName; })
    ->mapAssocAs(function(string $playerName) : array{ return [strtolower($playerName), $playerName]; });

 

위와 같이 기존 배열 함수를 사용하는 방식은 함수가 중첩 될 때 코드 순서가 반대가 되는 데다가 들여 쓰기가 점점 더 깊어지는 문제점이 있죠.

ArrayUtils를 사용하는 방식은 코드의 순서가 곧 프로그램의 작동 순서이고, 매개변수 순서의 일관성을 보장하기 때문에, 코드를 작성하고 파악하는 데에 도움을 줍니다.


ArrayUtils는 원래 PMMP 플러그인을 개발하는 데에 사용하기 위해 제가 사용하는 기능만 천천히 구현해가면서 업데이트하던 virion 프로젝트였습니다.

arrayutils (PresentKim/arrayutils)
Builds in arrayutils in PresentKim/arrayutils by Poggit-CI

그러던 중 다른 PHP 프로젝트에서도 충분히 사용할 수 있을 것 같다는 의견이 많아서 PHP의 배열 함수 문서JS의 Array 문서를 기반으로 모든 메소드를 구현한 뒤 아예 Composer에도 등록했습니다.

presentkim/arrayutils - Packagist
Library that provides a method to fancy manipulate an array

자세한 내용은 아래 링크로 이동해 확인하실 수 있습니다.

Introduction
API DOCS