<?php
/**
* Разбивает массив на чанки размером [n,2n-1]
*/
function array_chunk_min($list, $minSize){
$listCount = count($list);
$chunks = array_chunk($list, $minSize);
$chunksCount = count($chunks);
if ($listCount > $minSize && count($chunks[$chunksCount - 1]) % $minSize > 0) {
$chunks[$chunksCount - 2] = array_merge($chunks[$chunksCount - 2], $chunks[$chunksCount - 1]);
array_pop($chunks);
}
return $chunks;
}
print_r(array_chunk_min(range(1,45),20)); // [[1...20],[21...45]]
print_r(array_chunk_min(range(1,19),20)); // [[1...19]]
<?php
/**
* Разбивает массив на чанки размером [n,2n-1]
*/
function array_chunk_min($list,$minSize){
$cnt = count($list);
if($cnt <= $minSize){
return array($list);
}
$lastChunkSize = $cnt%$minSize;
if($lastChunkSize > 0){
$chunks = array_chunk(array_slice($list, 0, $cnt-$lastChunkSize),$minSize);
$lastChunk = array_slice($list, $cnt-$lastChunkSize,$minSize);
$cntChunks = count($chunks);
$chunks[$cntChunks-1] = array_merge($chunks[$cntChunks-1],$lastChunk);
}else{
$chunks = array_chunk($list, $minSize);
}
return $chunks;
}
print_r(array_chunk_min(range(1,45),20)); // [[1...20],[21...45]]
print_r(array_chunk_min(range(1,19),20)); // [[1...19]]
На вход поступает плоский список с id и id_parent, за счет ссылок(&) добавляем элементы, и в итоге получаем желанное дерево, если возникли вопросы то пожалуйста напишите мне.
/*
* Пример входных данных
**/
$list = [
1 => ["id" => 1, "id_parent" => null, "name" => "TEST1"],
2 => ["id" => 2, "id_parent" => 1, "name" => "TEST2"],
3 => ["id" => 3, "id_parent" => 1, "name" => "TEST3"],
4 => ["id" => 4, "id_parent" => 3, "name" => "TEST4"],
];
foreach ($list as $item) {
if (empty($item['id_parent']) || empty($list[$item['id_parent']])) {
$result[] = & $list[$item['id']];
} else {
$parent = & $list[$item['id_parent']];
$parent['items'][] = & $list[$item['id']];
}
}
На вход поступает плоский список с id и id_parent, за счет ссылок(&) добавляем элементы, и в итоге получаем желанное дерево, если возникли вопросы то пожалуйста напишите мне.
Пример входных данных
$list = [
1 => ["id" => 1, "id_parent" => null, "name" => "TEST1"],
2 => ["id" => 2, "id_parent" => 1, "name" => "TEST2"],
3 => ["id" => 3, "id_parent" => 1, "name" => "TEST3"],
4 => ["id" => 4, "id_parent" => 3, "name" => "TEST4"],
];
foreach ($list as $item) {
if (empty($item['id_parent']) || empty($list[$item['id_parent']])) {
$result[] = & $list[$item['id']];
} else {
$parent = & $list[$item['id_parent']];
$parent['items'][] = & $list[$item['id']];
}
}
Иногда требуется, чтобы определённые ключи в массиве оказались в начале в определённом порядке.
$data = [
'orange' => 'orange',
'apple' => 'tasty',
'carpet' => 'old',
'car' => 'fast',
];
$result = orderByKeys($data, ['car', 'carpet']);
Получим:
$data = [
'car' => 'fast',
'carpet' => 'old',
'orange' => 'orange',
'apple' => 'tasty',
];
function orderByKeys(array $array, array $keys)
{
foreach ($keys as $k => $v) {
if (!array_key_exists($v, $array)) {
unset($keys[$k]);
}
}
return array_replace(array_flip($keys), $array);
}
Пройтись по массиву циклом, но последний элемент обработать особенным образом. Задачка типичная, решений много. Одно из лучших в то же время является одним из простейших.
$last = array_pop($array);
foreach ($array as $value) {
// делаем что-либо с каждым элементом
}
// делаем что-либо с последним элементом $last
Функция возвращает массив содержащий диапазон чисел с start по count.
function range(start, count) {
return Array.apply(0, Array(count))
.map(function (element, index) {
return index + start;
});
}
Удалить повторяющиеся значения из многомерного массива
// 1 вложенность
$array = array_map("unserialize", array_unique(array_map("serialize", $array)));
// Рекурсивно
function super_unique($array) {
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
foreach ($result as $key => $value) {
if ( is_array($value) ) {
$result[$key] = super_unique($value);
}
}
return $result;
}
Если вы разрабатываете консольное приложение на PHP, и вам необходимо вывести данные, например в такую виртуальную таблицу:
+-------+-------+-------------+
| ID | Имя | Телефон |
+-------+-------+-------------+
| 1 | Иван | 89526787856 |
+-------+-------+-------------+
Вы можете использовать этот класс. Что бы вывести данные в таблицу, делаем следующее:
require_once('TableFormatter.php');
$path = './storage/data.json';
if ( ! file_exists($path)) {
throw new Exception('Отсутствует файл с данными.');
}
$i = 0;
$header = '';
$data = json_decode(file_get_contents($path), true);
$formatter = new TableFormatter($data);
foreach ($data as $item) {
echo $formatter->getTableLine();
echo $formatter->getRow($item);
echo count($data) - 1 === $i ++ ? $formatter->getTableLine() : false;
}
Массив для данного примера будет выглядеть таким:
$table = [['ID', 'Имя', 'Телефон'], ['1', 'Иван', '89526787856']];
/**
* Класс для фомирования таблицы в консоли
* @author: Дамир Фаттахов
*/
class TableFormatter {
private $data = [];
/**
* @param $data
* @throws Exception
*/
public function __construct($data) {
if (isset($data)) {
$this->data = $data;
} else {
throw new Exception('Необходимо передать заполненный массив');
}
}
/**
* Получение форматированной строки
* @param $row
* @return string
*/
public function getRow($row) {
$formatted_row = '';
foreach ($row as $key => $val) {
$formatted_row .= "|$val" . str_repeat(' ', $this->getColumnLength($key) - strlen($val));
}
return $formatted_row . "|\n";
}
/**
* Получение линий для таблицы
* Длинна линни зависит от кол-ва символов в элементе массива
* @return string
*/
public function getTableLine() {
$line = '';
foreach ($this->data[0] as $key => $val) {
$line .= '+' . str_repeat("-", $this->getColumnLength($key));
}
$line .= "+\n";
return $line;
}
/**
* Обход всего массива, поиск самого большого элемента, получение длинны колонки
* @param $element
* @return int
*/
public function getColumnLength($element) {
$max = 0;
foreach ($this->data as $item) {
$len = strlen($item[$element]);
if ($len > $max) {
$max = $len;
}
}
return $max;
}
}