Hi.

Я хочу представить свой первый проект с открытым исходным кодом, размещенный на github. Это библиотека, которая обеспечивает удобный и совершенно новый опыт работы с массивами чисел в php. Меня вдохновила numpy - библиотека python для тех же целей, которая включает в себя также огромное количество операций математической и линейной алгебры.

Я был очень удивлен, что у php нет такой мощности, как у библиотеки python numpy. Конечно, есть несколько репозиториев, называемых numphp, но, как я вижу, они далеки от исходной библиотеки. Моя цель - создать что-то похожее хотя бы по синтаксису и функциям. Вторая цель - повысить производительность и ускорить работу этого собственного массива php.

Итак, короче. Представьте, что у вас есть массив чисел, которые представляют температуру за определенный период времени, скажем:

$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]

Но ждать. Все это касалось выбора и установки элементов. Но как насчет некоторых математических операций? Отличный вопрос.

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

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

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

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

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

$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 предоставляет элегантный синтаксический сахар для рутинных операций с числовыми массивами. Я описал только основную идею этой библиотеки. В нем уже реализованы некоторые полезные помощники, такие как генераторы массивов (единиц, нулей, диапазонов или даже чисел Фибоначчи), заполнитель случайных данных и так далее.

Имейте в виду, что эта библиотека находится в начале пути, и я планирую добавить еще больше функций. Важнейшей особенностью будет возможность работать с n-мерными массивами (матрицами) и выполнять все операции линейной алгебры.

Вы можете найти текущую документацию и репозиторий здесь: https://github.com/apollonin/numphp

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