我有一个像这样的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"
}
我的代码结构如下:
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
。然后,我对其进行了编辑以反映我的特定问题。抱歉造成混乱。
答案 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
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
)
虽然它不是“理想”的,但它会起作用。
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]
中(字符0
至9
的范围与\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 ;
}