sensus
@sensus

Как сформировать массив?

Добрый вечер.
Что то затупил на простом моменте и не могу сообразить.
Помогите кто чем может +)

Собственно есть массив
$arr = [
//...
    11 => true, 
    12 => true, 
    15 => false, 
    16 => true, 
    17 => false
    18 => false
//...
];


Как его можно сгруппировать в цикле, что бы на выходе получить такой формат:
(ключ в значение ну и булевое тоже. Если подряд идет несколько одинаковых статусов, то их надо объединить в строку.)
$response = [
    0 => "11 - 12 true",
    1 => "15 - 15 false",
    3 => "16 - 16 true",
    4 => "17 - 18 false"
];


Есть какой то алгоритм или что то подобное?
  • Вопрос задан
  • 235 просмотров
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Без претензий на красоту кода.
Предполагается что исходный массив отсортирован по ключу, пропусков нет.

$arr = [
    11 => true, 
    12 => true, 
    15 => false, 
    16 => true, 
    17 => false,
    18 => false
];

reset($arr);
$key_from = key($arr);
$key_to = key($arr);
$last_value = array_values($arr)[0]; 

$result = [];
foreach ($arr as $key => $value) {
    if ($last_value == $value) {
        $key_to = $key;
    } else {
        $result[] = $key_from . ' - ' . $key_to . ' ' . (($last_value) ? 'true' : 'false');
        $key_from = $key;
        $key_to = $key;
        $last_value = $value;
    }
}
$result[] = $key_from . ' - ' . $key_to . ' ' . (($last_value) ? 'true' : 'false');


print_r($result);
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Без повтора формирования строки:
<?php
$arr = [
//...
    11 => true, 
    12 => true, 
    15 => false, 
    16 => true, 
    17 => false,
    18 => false
//...
];

function group($arr) {
	$out = [];

	$v_in = reset($arr);
	$k_in = $k_out = key($arr);

	while( $k_out !== null) {

		$v = next($arr);
		$k = key($arr);

		if( null !== $k  &&  $v === $v_in) {
			$k_out = $k;
			continue;
		}
		
		$out[] = sprintf('%d - %d %s', $k_in, $k_out, $v_in ? 'true' : 'false');

		$k_in = $k_out = $k;
		$v_in = $v;
	}
	
	return $out;
}

print_r( group($arr)); 
/* Array
(
    [0] => 11 - 12 true
    [1] => 15 - 15 false
    [2] => 16 - 16 true
    [3] => 17 - 18 false
) */
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы