Вот что я бы сделал, используя малоизвестную функцию 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
.Ура.
Я лично сохранил бы его в базе данных. Во-первых, потому что Ваши данные намного более безопасны там, и они облегчают совместно использовать в случае, где Вам нужна веб-ферма. Кроме того, у Вас не должно быть данных на каждой странице. Как раз в то самое время, когда пользователь переходит к магазинной тележке. Другой плюс хранения его в базе данных - то, что можно проанализировать позже, материал, который люди добавляют в корзину, но не на самом деле покупают.
Я сохранил бы все это в базе данных и получил бы его каждый раз. В зависимости от энергозависимости данных, кэширующихся в течение нескольких секунд, может быть в порядке. Самая большая проблема сохраняет два последовательными.
я думаю, что это не столь дорого, как Вы думаете для получения данных каждый раз. Базы данных очень эффективны, если Вы ищете на основе ключа. Я допустил бы ошибку на стороне простоты (хранилище в DB и получил бы), пока проблемы производительности не обнаруживаются при загрузке (т.е. в Тестировании Загрузки).
, Если там будет только несколько разы, можно быть в состоянии использовать Кэш приложения (если у Вас нет больше чем одного рабочего процесса / сервер), и удостоверьтесь, что DB и кэш остаются в синхронизации.