Массив пропускает числовой индекс при добавлении элемента? - PullRequest
0 голосов
/ 08 октября 2019

При модификации движка интернет-магазина я столкнулся с забавной ошибкой:

// ...

$this->toolbar_title[] = 'Products';

// ...

print_r($this->toolbar_title);
/*
Array (
    [0] => Products 
)
*/

$this->toolbar_title[] = 'Filtered by: name';
print_r($this->toolbar_title);
/*
Array
(
    [0] => Products
    [2] => Filtered by: name
)
*/
// ...

wat ??? где индекс "1" ?? Пытался воспроизвести это в чистом автономном сценарии php - нет! добавленный элемент имеет индекс "1", как и ожидалось. но при выполнении того же самого в коде движка - новый элемент имеет индекс "2".

Не найдено никаких сеттеров, не найдена перегрузка "[]", даже нет никакого доступа к элементам $ this-> toolbar_titleИндекс, только нажимая через [];

Что это за магия? Что и где я должен искать, чтобы найти причину? PHP 5.6, движок PrestaShop 1.6.

Заранее большое спасибо за любую подсказку.

UPD: точный фрагмент кода из движка

        if ($filter = $this->addFiltersToBreadcrumbs()) {
            echo'131-';print_r($this->toolbar_title);
            $this->toolbar_title[] = $filter;
            echo'132-';var_dump($this->toolbar_title);
        }

, где addFiltersToBreadcrumbs возвращает строкуи не делать никакого доступа к toolbar_title

UPD2:

public function addFiltersToBreadcrumbs()
{
    if ($this->filter && is_array($this->fields_list)) {
        $filters = array();

        foreach ($this->fields_list as $field => $t) {
            if (isset($t['filter_key'])) {
                $field = $t['filter_key'];
            }

            if (($val = Tools::getValue($this->table.'Filter_'.$field)) || $val = $this->context->cookie->{$this->getCookieFilterPrefix().$this->table.'Filter_'.$field}) {
                if (!is_array($val)) {
                    $filter_value = '';
                    if (isset($t['type']) && $t['type'] == 'bool') {
                        $filter_value = ((bool)$val) ? $this->l('yes') : $this->l('no');
                    } elseif (isset($t['type']) && $t['type'] == 'date' || isset($t['type']) && $t['type'] == 'datetime') {
                        $date = Tools::unSerialize($val);
                        if (isset($date[0])) {
                            $filter_value = $date[0];
                            if (isset($date[1]) && !empty($date[1])) {
                                $filter_value .= ' - '.$date[1];
                            }
                        }
                    } elseif (is_string($val)) {
                        $filter_value = htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
                    }
                    if (!empty($filter_value)) {
                        $filters[] = sprintf($this->l('%s: %s'), $t['title'], $filter_value);
                    }
                } else {
                    $filter_value = '';
                    foreach ($val as $v) {
                        if (is_string($v) && !empty($v)) {
                            $filter_value .= ' - '.htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
                        }
                    }
                    $filter_value = ltrim($filter_value, ' -');
                    if (!empty($filter_value)) {
                        $filters[] = sprintf($this->l('%s: %s'), $t['title'], $filter_value);
                    }
                }
            }
        }

        if (count($filters)) {
            return sprintf($this->l('filter by %s'), implode(', ', $filters));
        }
    }
}

1 Ответ

0 голосов
/ 08 октября 2019

Для php, если вы удалите один индекс в массиве, индекс будет отображаться прерывистым ростом.

$this->toolbar_title = array_values($this->toolbar_title);

перестроит индекс.

...