gpt4 book ai didi

php - 从数组对象中按键获取上一个和下一个数组

转载 作者:行者123 更新时间:2023-12-03 19:41:07 26 4
gpt4 key购买 nike

我有数组对象,想通过特定键获取 2 个上一个和 2 个下一个数组组。

Array
(
[467] => stdClass Object
(
[id] => 467
[user_id] => 1
)

[468] => stdClass Object
(
[id] => 468
[user_id] => 1
)

[469] => stdClass Object
(
[id] => 469
[user_id] => 1
)

[474] => stdClass Object
(
[id] => 474
[user_id] => 1
)

[475] => stdClass Object
(
[id] => 475
[user_id] => 1
)

[479] => stdClass Object
(
[id] => 479
[user_id] => 1
)

[480] => stdClass Object
(
[id] => 480
[user_id] => 1
)
)

如果键定义 474 将导致:

  • 来自键 469 和 468 的前一个数组组
  • 键 475 和 479 的下一个数组组
  • 如果没有上一个和下一个数组,我不想要结果

我尝试了这个方法,但没有用。

$val = 474;
$currentKey = array_search($val, $array);

$before = (isset($array[$currentKey - 2])) ? $array[$currentKey - 2] :
$after = (isset($array[$currentKey + 2])) ? $array[$currentKey + 2] : $array[0];

var_dump($before, $after);

请帮忙。

最佳答案

我的方法要做的是,搜索 $key 值并在数组中返回它的 offset。您在输入数组的值上使用了 array_search(),所以这就是它失败的地方。

然后,如果 offset 值不为假,我会尝试从输入数组中切出 5 个所需的子数组。如果它不返回 5,则失败。

如果子数组的集合小于5,第二个代码不会触发失败。

代码:(Demo)

$array=[
467=>(object)['id'=>467,'user_id'=>1],
468=>(object)['id'=>468,'user_id'=>1],
469=>(object)['id'=>469,'user_id'=>1],
474=>(object)['id'=>474,'user_id'=>1],
475=>(object)['id'=>475,'user_id'=>1],
479=>(object)['id'=>479,'user_id'=>1],
480=>(object)['id'=>480,'user_id'=>1]
];

$key=480;

// require 5 subarrays or none:
if(($offset=array_search($key,array_keys($array)))<2 || sizeof($result=array_slice($array,$offset-2,5))!=5){
echo "Fail";
}else{
var_export($result);
}

echo "\n---\n";

// allow any number of subarrays up to 5:
if(($offset=array_search($key,array_keys($array)))===false){
echo "Fail";
}else{
// adjust $offset and $length values to handle array "overflow"
if($offset<2){
$length=$offset+3;
}elseif(($diff=sizeof($array)-$offset)<3){
$length=$diff+2;
}else{
$length=5;
}
$offset=max(0,$offset-2);
var_export(array_slice($array,$offset,$length));
}

输出:

Fail
---
array (
0 =>
stdClass::__set_state(array(
'id' => 475,
'user_id' => 1,
)),
1 =>
stdClass::__set_state(array(
'id' => 479,
'user_id' => 1,
)),
2 =>
stdClass::__set_state(array(
'id' => 480,
'user_id' => 1,
)),
)

这是第二种方法的直观表示和更多解释:

以下说明使用 6 元素数组来演示计算。

I = 'elements labeled by their indices'
S = 'the slice'
T = 'target index'
L = 'length of slice'

I ST ST ST ST ST ST When $target index is:
0 ╗0 ╗ ╗ 0, then $offset=0 and $length=3
1 ║ ║1 ║ ╗ 1, then $offset=0 and $length=4
2 ╝ ║ ║2 ║ ╗ 2, then $offset=0 and $length=5
3 ╝ ║ ║3 ║ ╗ 3, then $offset=1 and $length=5
4 ╝ ║ ║4 ║ 4, then $offset=2 and $length=4
5 ╝ ╝ ╝5 5, then $offset=3 and $length=3
L: 3 4 5 5 4 3

关于php - 从数组对象中按键获取上一个和下一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47465535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com