Проблема при записи в сессию

149
02 июля 2019, 11:30

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

foreach($_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'] as $secId => $val)
{
    if($secId == $curSecId)
    {
        $checkSection = true;
        break;
    }
}
if( $checkSection )
{
    $_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'][$curSecId][] = $prodId;
}
else
{
    $_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'] = ["{$curSecId}" => $prodId];
}

Проблема возникает, когда ключ есть. Fatal error: [] operator not supported for strings in . Подскажите, как исправить?

Answer 1

Если в SECTIONS хранятся пары ключ-значение, то так:

$_SESSION = [
    'PRODUCTS_IN_COMPARED' => [
        'SECTIONS' => [
            'secId' => 'val'
        ]
    ]
];
$prodId = 'prodIt';
save('secId', $prodId);
var_export($_SESSION);
/*
array (
    'PRODUCTS_IN_COMPARED' =>
    array (
      'SECTIONS' =>
      array (
        'secId' => 'prodIt',
      ),
    ),
  )
*/
save('new', $prodId);
var_export($_SESSION);
/*
array (
  'PRODUCTS_IN_COMPARED' =>
  array (
    'SECTIONS' =>
    array (
      'new' => 'prodIt',
    ),
  ),
)
*/
function save($curSecId, $prodId) {
    $checkSection = false;
    foreach($_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'] as $secId => $val)
    {
        if($secId == $curSecId)
        {
            $checkSection = true;
            break;
        }
    }
    if( $checkSection )
    {
        $_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'][$curSecId] = $prodId;
    }
    else
    {
        $_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'] = ["{$curSecId}" => $prodId];
    }
}

Если в SECTION хранятся ключи с массивом значений, то так:

<?php
$_SESSION = [
    'PRODUCTS_IN_COMPARED' => [
        'SECTIONS' => [
            'secId' => [
                'val'
            ]
        ]
    ]
];
$prodId = 'prodIt';
save('secId', $prodId);
var_export($_SESSION);
/*
array (
  'PRODUCTS_IN_COMPARED' =>
  array (
    'SECTIONS' =>
    array (
      'secId' =>
      array (
        0 => 'val',
        1 => 'prodIt',
      ),
    ),
  ),
)
*/
save('new', $prodId);
var_export($_SESSION);
/*
array (
  'PRODUCTS_IN_COMPARED' =>
  array (
    'SECTIONS' =>
    array (
      'secId' =>
      array (
        0 => 'val',
        1 => 'prodIt',
      ),
      0 =>
      array (
        'new' =>
        array (
          0 => 'prodIt',
        ),
      ),
    ),
  ),
)
*/
function save($curSecId, $prodId) {
    $checkSection = false;
    foreach($_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'] as $secId => $val)
    {
        if($secId == $curSecId)
        {
            $checkSection = true;
            break;
        }
    }
    if( $checkSection )
    {
        $_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'][$curSecId][] = $prodId;
    }
    else
    {
        $_SESSION['PRODUCTS_IN_COMPARED']['SECTIONS'][] = ["{$curSecId}" => [$prodId]];
    }
}
READ ALSO
Яндекс.Касса - получение уведомления

Яндекс.Касса - получение уведомления

никак не могу вкурить, что я должен выловить в на URI, указанном для уведомленийПлатежи проходят, вот такой код

134
Не загружаюься фото на сервер

Не загружаюься фото на сервер

Почему фото не загружаются в директорию? Я даже проверил настройки php и пункт file_uploads имеет значение on

120
C++ линия, нарисованная через HDC LineTo(), мерцает

C++ линия, нарисованная через HDC LineTo(), мерцает

При запуске, программа должна рисовать короткую линию по середине экрана (Поверх всех программ)Линия рисуется, все хорошо, но очень сильно...

130
Оператор эквивалентности &lt;=&gt;

Оператор эквивалентности <=>

Увидел недавно оператор <=> в чужом коде и испытал культурный шокЧто за зверь, что он делает и когда использовать?

133