получить ключ объекта, заканчивающийся наибольшим числом, но не числовым

DateTime сохраняет дату как числовое значение, а не как строку. Поэтому запрос формата DateTime формата «MM / dd / yyyy» не имеет большого смысла. Если вы показываете дату в элементе управления WPF, по умолчанию будет отображать строку, соответствующую формату системной даты. Но это только строка отображения , с которой вы можете манипулировать, используя строки формата, упомянутые в ссылках выше. Использование кода @ Sajeetharan создаст структуру DateTime с правильным значением внутри. Как вы показываете это зависит от вас и ваших вариантов форматирования строк.

То же самое касается дат, хранящихся в столбце базы данных типа «datetime». Значение хранится численно. Ваш редактор запросов отобразит значение, вероятно, в том же формате, что и ваши системные настройки. Если дата хранится в виде строки, то снова код @ Sajeetharan является правильным способом преобразования строки базы данных в структуру DateTime.

0
задан COOLak 4 March 2019 в 00:41
поделиться

3 ответа

Используя регулярное выражение, извлеките числа и затем используйте функцию 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 ;
}
0
ответ дан Rahul Sharma 4 March 2019 в 00:41
поделиться

Regex не скажет вам, какое число больше. Но эти ключи «photo_N» можно отсортировать в естественном порядке.

Вы не упомянули имя вашей переменной, поэтому для удобства я просто приму здесь $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);
0
ответ дан rickdenhaan 4 March 2019 в 00:41
поделиться

Вот что я бы сделал, используя малоизвестную функцию 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 для объекта? Потому что, к сожалению, я перепутал его с массивом.

Нет, но вы можете привести его (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

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

Я думаю, что это $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.

Ура.

0
ответ дан marc_s 4 March 2019 в 00:41
поделиться
Другие вопросы по тегам:

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