Pull to refresh

Numphp — библиотека для работы с числовыми массивами

PHP *Data Mining *
Привет.

Я бы хотел представить мой первый open source проект, размещённый на github. Это библиотека предоставляющая удобный и совершенно новый опыт работы с числовыми массивами в php. Вдохновением для создания послужила библиотека numoy на языке Python, которая включает широкий спектр возможностей для манипулирования данными и инструментами линейной алгебры.

Честно говоря, я был удивлён, когда обнаружил что на php до сих пор нет достойного аналога numpy. Конечно, некоторые попытки реализации можно найти на гитхабе, но они все крайне далеки от оригинала и не разделяют ту же идеологию. Моей целью было и есть создание похожей библиотеки, как минимум в отношении удобства использования и краткости синтаксиса. В дальнейших планах будет улучшение производительности.

В общем, приступим. Представьте, что у вас есть массив чисел, к примеру, представляющих собой значения температуры за какой-то период времени.

$list = [16, 22, -6, 23, -1, 13, 24, -23, 22];

И вам для дальнейшей работы нужно из этого массива выбрать только те значения, когда температура была выше нуля. В классическом случае вы бы сделали что-то вроде такого:


$result = [];
for($i=0; $i<count($list); $i++)
    if ($list[$i] >= 0)
        $result[] = $list[$i];

В результате получим массив из 6 элементов. Но, для такой простой и тривиальной операции мы напечатали слишком много кода. Конечно, можно использовать краткие версии вроде array_walk или аналогичные, но, всё равно будет много явной логики.

Библиотека numphp же предоставляет простой, но, в то же время, богатый функционал по выборке данных из числового массива по условию. Для решение той же задачи, вы можете просто написать:


// cast our array to the numphp array 
$list = new np_array($list);
$result = $list[$list['> 0']];

Вот так просто!

Более того, это только лишь начало. Вы можете манипулировать данным объектом как захотите и даже устанавливать значения по определённому условию.


$list[$list['< 0']] = 0;
//result
[16, 22, 0, 23, 0, 13, 24, 0, 22]

Но постойте. До сих пор мы говорили только про выборку и изменение данных. А как насчёт математических операций? Хороший вопрос.

Давайте представим, вы создаёте RPG игру и у вашего героя есть какие-то способности, представленные в таком формате:


$powers = [62, 88, 34, 29];

Теперь, во время повышения уровня, вы хотите увеличить каждую способность на определённый показатель. Опять же, как бы вы поступили без numphp?


for($i=0; $i<count($powers); $i++)
    $powers[$i]++;

Этот код работает, но разве он выглядит восхитительно? Вам нужно писать эти циклы раз за разом. Сравните это с элегантным решением библиотеки numphp:


$powers = $powers->add(1);

Более того, вы можете объединить предыдущие две возможности и, скажем, увеличить только те способности, которые на данный момент имеют значение меньше 30:


$powers = $powers[$powers['< 30']]->add(1);

Другая крутая возможность состоит в том, что вы можете выполнять математические операции и операции сравнения между двумя массивами всё в том же простом и понятном синтаксисе:


$powers = [62, 88, 34, 29];
$intensify = [2, 5, 4, 1];
$result = $powers->add($intensify);
//result
[64, 93, 38, 30]

Как вы можете видеть, numphp предоставляет элегантный синтаксический сахар для рутинных операций с числовыми массивами. Я описал лишь главную идею и возможности библиотеки на данный момент. Дополнительно уже реализованы удобные хелперы вроде генераторов (массив нулей, единиц, диапазона и даже ряда Фибоначчи), random модуль и так далее.

Обратите внимание, библиотека находится только в самом начале своего развития и я планирую добавлять новые возможности. Самая главная из них на данный момент — возможность работы с n-мерными массивами (матрицами, к примеру) и выполнять все основные виды операций из линейной алгебры.

Дополнительные возможности и документацию вы можете найти здесь.

Также, если вы хотите внести свой вклад в развитие — буду рад обсудить любые вопросы.
Tags:
Hubs:
Total votes 18: ↑14 and ↓4 +10
Views 5.1K
Comments Comments 57