Хранение корзины на сессии

Вот что я бы сделал, используя малоизвестную функцию preg_grep:

$array = [
      "photo_75"=> "https=>//example.com/random_unique_string/random_unique_name.jpg",
      "photo_130"=> "https=>//example.com/random_unique_string/random_unique_name.jpg",
      "photo_604"=> "https=>//example.com/random_unique_string/random_unique_name.jpg",
      "photo_807"=> "https=>//example.com/random_unique_string/random_unique_name.jpg",
      "photo_1280"=> "https=>//example.com/random_unique_string/random_unique_name.jpg",
      "photo_2560"=> "https=>//example.com/random_unique_string/random_unique_name.jpg",
      "width"=> 2560,
      "height"=> 1440,
      "text"=> "",
      "date"=> 1517775329,
      "access_key"=> "key"
];

$array = preg_grep('/^photo_\d+$/', array_keys($array));

sort($array, SORT_NATURAL);

print_r(end($array));

Вывод

 photo_2560

Песочница

Preg Grep позволяет искать в массиве с помощью регулярного выражения. Это похоже на использование фильтра массива и preg_match

   $array = array_filter($array, function($item){
        return preg_match('/^photo_\d+$/', $item);
   });

Но, очевидно, намного короче. Как и фильтр массива, он в основном используется для значений, а не для ключей, но мы можем использовать array_keys, чтобы обойти это. Array Keys возвращает массив ключей в виде нового значения массива array(0=>'key', ..), которое является именно тем, что мы хотим.

ОБНОВЛЕНИЕ

На основании этого комментария:

Есть ли альтернатива array_keys для объекта? Потому что, к сожалению, я перепутал его с массивом.

blockquote>

Нет, но вы можете привести его (array)$obj к массиву, если свойства общедоступны. Мы можем легко продемонстрировать это:

class foo{

    public $bar = 'hello';
}

print_r(array_keys((array)(new foo)));

Выходные данные

 array(
      0 => 'bar' //which is the key 'bar' or the property named $bar
 )

Песочница

Хотя это не «идеально», оно будет работать. [1144 ]

ОБНОВЛЕНИЕ1

Я внес изменения в свой вопрос, пожалуйста, посмотрите. Я не понимаю, как применить ваш пример в этом случае: (

blockquote>

Я думаю, что это $attachment->photo в вашем коде, это действительно трудно сказать по изображению. Это везде «вещи» в самом верху вас возник вопрос, данные вашего примера.

В любом случае с вашим кодом вы бы сделали что-то вроде этого:

foreach ( $response->posts as $key => $element ) {
    if ( isset ($element->attachments) ) {
       foreach ( $element->attachments as $key_att => $attachment ) {
            if ( $attachment->type == 'photo' ) {
                  //new code
                 $array = preg_grep('/^photo_\d+$/', array_keys((array)$attachment->photo));

                 sort($array, SORT_NATURAL);
                 $result = end($array);
                 print_r($result);
            }
       } //end foreach
    }
}//end foreach

Кстати, Regex, который я использую [ 1111] в основном это

  • ^ соответствует началу строки
  • photo_ соответствует «photo_» буквально
  • \d+ соответствует одному или нескольким цифры
  • $ соответствуют концу строки.

Обратите внимание, что ^ может иметь различное значение в зависимости от того, где он находится, например, если он находится в классе символов [0-9] ] (Диапазон символов 0 - 9 такой же, как \d), например, [^0-9] означает НЕ , поэтому класс символов соответствует всему, кроме того, что в нем. Или «отрицание» ". Это немного сбивает с толку, но именно так оно и работает. В этом случае это будет что-то, а НЕ цифра.

Используя ^ и $, мы говорим, что наше регулярное выражение должно соответствовать всей строке. Таким образом, мы можем избежать таких вещей, как somephoto_79890_aab, которые, если бы у нас не было , не имели маркеров начала и конца, то наше регулярное выражение photo_\d+ соответствовало бы этой части some[photo_79890]_aab.

Ура.

7
задан Kevin Pang 18 November 2008 в 01:25
поделиться

2 ответа

Я лично сохранил бы его в базе данных. Во-первых, потому что Ваши данные намного более безопасны там, и они облегчают совместно использовать в случае, где Вам нужна веб-ферма. Кроме того, у Вас не должно быть данных на каждой странице. Как раз в то самое время, когда пользователь переходит к магазинной тележке. Другой плюс хранения его в базе данных - то, что можно проанализировать позже, материал, который люди добавляют в корзину, но не на самом деле покупают.

4
ответ дан 7 December 2019 в 01:28
поделиться

Я сохранил бы все это в базе данных и получил бы его каждый раз. В зависимости от энергозависимости данных, кэширующихся в течение нескольких секунд, может быть в порядке. Самая большая проблема сохраняет два последовательными.

я думаю, что это не столь дорого, как Вы думаете для получения данных каждый раз. Базы данных очень эффективны, если Вы ищете на основе ключа. Я допустил бы ошибку на стороне простоты (хранилище в DB и получил бы), пока проблемы производительности не обнаруживаются при загрузке (т.е. в Тестировании Загрузки).

, Если там будет только несколько разы, можно быть в состоянии использовать Кэш приложения (если у Вас нет больше чем одного рабочего процесса / сервер), и удостоверьтесь, что DB и кэш остаются в синхронизации.

6
ответ дан 7 December 2019 в 01:28
поделиться
Другие вопросы по тегам:

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