Подсчёт в масиве php

108
13 апреля 2021, 22:00

Прошу помощи, мозг кипит. Есть масив с маршрутом и промежуточными остановками [napravlenie] А в нем еще масивы с пунтом отправления [ot] пунтом прибытия [do] и количеством забранированых мест [person]

Array (
 [napravlenie] => ko-od-ki-che
 [0] => Array ( [ot] => ko [do] => ki [person] => 2 )
 [1] => Array ( [ot] => od [do] => ki [person] => 2 )
 [2] => Array ( [ot] => od [do] => ki [person] => 2 )
 [3] => Array ( [ot] => od [do] => che [person] => 1 )
 [4] => Array ( [ot] => ki [do] => che [person] => 1 ) 
) 

Задача пощитать количество занятых мест до каждого пункта. Нужно учитывать [ot] => od [do] => che проходит через ki и сответственно от od-ki место тоже занято

Answer 1
class TourCapacitor
{
    protected $delta = [];
    /**
     * @param array route Маршрут с идентификаторами остановок 
     */
    public function __construct(array $route)
    {
        foreach ($route as $row) {
            $this->delta[$row] = null;
        }
    }
    public function add($itemId)
    {
        if ($this->delta[$itemId]) {
            $this->delta[$itemId] += 1;
        } else {
            $this->delta[$itemId] = 1;
        }
    }
    public function remove($itemId)
    {
        if ($this->delta[$itemId]) {
            $this->delta[$itemId] -= 1;
        } else {
            $this->delta[$itemId] = -1;
        }
    }
    /**
     *
     * @return array
     */
    public function getCapacities()
    {
        $result = [];
        if (!$this->delta) {
            return $result;
        }
        $i = 0;
        foreach ($this->delta as $key => $value) {
            if ($value === null) {
                continue;
            }
            // создаём новую остановку
            $result[$i] = ['key' => $key, 'value' => $value];
            // если есть предыдущая остановка, добавляем её значение
            if ($i > 0) {
                $result[$i]['value'] += $result[$i - 1]['value'];
            }
            $i++;
        }
        return $result;
    }
}

Считаем

$capacity = new TourCapacitor([1, 2, 3, 4, 5]);
// $orders - массив с заказами. stationFrom - остановка посадки. stationTo - остановка высадки
foreach ($orders as $row) {
    $capacity->add($row['stationFrom']);
    $capacity->remove($row['stationTo']);
}
var_dump($capacity->getCapacities());
Answer 2

То что я искал.

header('Content-type: text/html; charset=utf-8');
$A = array(
    'napravlenie' => 'ko-od-ki-che',
    0 => array('ot' => 'ko', 'do' => 'ki',  'person' => 2),
    1 => array('ot' => 'od', 'do' => 'ki',  'person' => 2),
    2 => array('ot' => 'od', 'do' => 'ki',  'person' => 2),
    3 => array('ot' => 'od', 'do' => 'che', 'person' => 1),
    4 => array('ot' => 'ki', 'do' => 'che', 'person' => 1)
);
# ($A[1] == $A[2]) -->>  $A[real][person] = $A[1][person] + $A[2][person] ...?
echo '<xmp>';
var_dump($A);
echo "---------------------\n\n";
$SEQ = explode('-', $A['napravlenie']);
$CUR_VAL = 0;
while (($OT = current($SEQ)) && $DO = next($SEQ)){
    for ($x=0; $x<count($A)-1; ++$x){
            if ($A[$x]['ot'] == $OT) $CUR_VAL += $A[$x]['person'];
        elseif( $A[$x]['do'] == $OT) $CUR_VAL -= $A[$x]['person'];
    }
    echo "$OT-$DO => $CUR_VAL\n";
}
echo '</xmp>';
READ ALSO
Как перевести сайт с помощью cookies?

Как перевести сайт с помощью cookies?

Планируем переводить сайт на англверсию

111
Почему Symfony создает fluent interface в генерации сущностей?

Почему Symfony создает fluent interface в генерации сущностей?

В статье о хорошей практике написания кода написано, что нужно избегать Fluent interface ссылка на статью

97
Не выводит записи в блоге WP

Не выводит записи в блоге WP

Всем привет, ситуация следующаяЕсть главная страница, типа лендинга, ее сделала через файл index

106