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