DateTime
сохраняет дату как числовое значение, а не как строку. Поэтому запрос формата DateTime
формата «MM / dd / yyyy» не имеет большого смысла. Если вы показываете дату в элементе управления WPF, по умолчанию будет отображать строку, соответствующую формату системной даты. Но это только строка отображения , с которой вы можете манипулировать, используя строки формата, упомянутые в ссылках выше. Использование кода @ Sajeetharan создаст структуру DateTime
с правильным значением внутри. Как вы показываете это зависит от вас и ваших вариантов форматирования строк.
То же самое касается дат, хранящихся в столбце базы данных типа «datetime». Значение хранится численно. Ваш редактор запросов отобразит значение, вероятно, в том же формате, что и ваши системные настройки. Если дата хранится в виде строки, то снова код @ Sajeetharan является правильным способом преобразования строки базы данных в структуру DateTime
.
Используя регулярное выражение, извлеките числа и затем используйте функцию MAX:
$mystring= '{
"type": "photo",
"photo": {
"id": id,
"album_id": album_id,
"owner_id": owner_id,
"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"
}';
if(preg_match_all("/photo_([0-9]+)/i", $mystring, $matches))
{
$maxValue = max($matches[1]);
echo 'photo_'.$maxValue ;
}
Regex не скажет вам, какое число больше. Но эти ключи «photo_N» можно отсортировать в естественном порядке.
Вы не упомянули имя вашей переменной, поэтому для удобства я просто приму здесь
blockquote>$array
.Давайте сначала получим только элементы «photo_N» из массива:
$photos = array_filter( $array['photo'], function($key) { return substr($key, 0, 6) === "photo_"; }, ARRAY_FILTER_USE_KEY );
Теперь мы можем отсортировать результат по ключу, используя естественный порядок:
ksort($photos, SORT_NATURAL);
Это должно было поставить фото с наибольшим цифровым ключом в конце, чтобы вы могли получить его значение, используя:
$photo = end($photos);
Вот что я бы сделал, используя малоизвестную функцию 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
.Ура.