获取以最大数字结尾而不是数字结尾的对象关键字

时间:2019-03-03 22:33:31

标签: php regex object

我有一个像这样的stdclass对象:

  {
    "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"
    }

此图片的外观更加完整:enter image description here

我的代码结构如下:

foreach ( $response->posts as $key => $element ) {
    if ( isset ($element->attachments) ) {
       foreach ( $element->attachments as $key_att => $attachment ) {
            if ( $attachment->type == 'photo' ) {
                //get the value of the photo with the maximum resolution
            }
       }
    }
}

在这种情况下,如何仅获取photo_2560的值,将其指向以最大数值结尾的photo_max仅适用于完全数字键...可能需要一个正则表达式,但是我对此感到无能。感谢您的帮助。

P。 S.我最初问的是数组而不是对象,所以给出的答案是有效的,我自己弄错了。问题的初始名称为get array key ending in highest number but not numerical。然后,我对其进行了编辑以反映我的特定问题。抱歉造成混乱。

3 个答案:

答案 0 :(得分:3)

这就是我使用鲜为人知的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

Sandbox

Preg Grep允许您使用正则表达式搜索数组,就像使用数组过滤器和preg_match

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

但是显然要短得多。像数组过滤器一样,它主要用于针对值而非键,但是我们可以使用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
 )

Sandbox

虽然它不是“理想”的,但它会起作用。

UPDATE1

  

我对问题进行了编辑,请看一看。在这种情况下,我不知道如何应用您的示例:(

我认为它在您的代码中是$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

通过我使用的^photo_\d+$正则表达式基本上就是这样

  • ^匹配字符串的开头
  • photo_完全匹配“ photo _”
  • \d+匹配一个或多个数字
  • $匹配字符串的结尾。

请注意,^的位置可能不同,例如,如果它在字符类[0-9]中(字符09的范围与\d)像这样[^0-9],这意味着,因此它使字符类与其中的所有字符都匹配。或“否定”。这有点令人困惑,但这就是它的工作原理。在这种情况下,它不是数字。

通过使用^$,我们说我们的正则表达式必须匹配整个字符串。因此,我们可以避免使用somephoto_79890_aab之类的东西,如果我们没有没有开始和结束标记,则我们的正则表达式photo_\d+会与some[photo_79890]_aab这部分匹配。

干杯。

答案 1 :(得分:2)

正则表达式不会告诉您最高的数字是多少。但是,可以使用自然顺序对这些“ 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);

答案 2 :(得分:0)

使用正则表达式,提取数字,然后使用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 ;
}