Для получения полного доступа
зарегистрируйтесь.
RSS

Все сниппеты с тэгом «работа с массивами»



Gravatar image
higimo
  • Репутация: 2
  • Сниппеты: 0
  • Ревизии: 1
<?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]]
Gravatar image
Ambalus
  • Репутация: 3
  • Сниппеты: 2
  • Ревизии: 0
<?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]]
Gravatar image
Константин Беннер
  • Репутация: 1
  • Сниппеты: 0
  • Ревизии: 1

На вход поступает плоский список с 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']];
    }
}
Gravatar image
Александр Коваленко
  • Репутация: 11
  • Сниппеты: 1
  • Ревизии: 0

На вход поступает плоский список с 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']];
    }
}
samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Иногда требуется, чтобы определённые ключи в массиве оказались в начале в определённом порядке.

$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);
}

dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Пройтись по массиву циклом, но последний элемент обработать особенным образом. Задачка типичная, решений много. Одно из лучших в то же время является одним из простейших.

$last = array_pop($array);
foreach ($array as $value) {
   // делаем что-либо с каждым элементом
}
// делаем что-либо с последним элементом $last
Сниппет,  JavaScript

Range generator

Gravatar image
Vitaliy Shkolin
  • Репутация: 3
  • Сниппеты: 1
  • Ревизии: 2

Функция возвращает массив содержащий диапазон чисел с start по count.

function range(start, count) {
    return Array.apply(0, Array(count))
        .map(function (element, index) {
            return index + start;
        });
}
Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

Удалить повторяющиеся значения из многомерного массива

// 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;
}
dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Если вы разрабатываете консольное приложение на 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;
	}
}