我正在尝试获取其中'expire'属性已从当前时间戳过去的'main'数组('111','222')之一。
我的数组的结构如下:
$stored = array(
'111' => array(
0 => array(
'type' => 'first',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-01 08:00:00')),
),
1 => array(
'type' => 'second',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-01 09:00:00')),
),
),
'222' => array(
0 => array(
'type' => 'first',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-02 12:00:00')),
),
1 => array(
'type' => 'second',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-02 13:00:00')),
),
2 => array(
'type' => 'third',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-02 14:00:00')),
),
),
);
我做了一些研究,发现array_column
是解决方案的一部分,但自尝试以来我不知道如何将其应用于我的案子
$list = array_column($stored, 'expire');
print_r($list);
并且它给出了一个空数组,所以这意味着array_column
在多维数组上不起作用。
答案 0 :(得分:0)
您可以仅遍历每个项目集合,然后使用array_filter
确定是否有任何项目过期。例如:
$expiredKeys = [];
foreach ($stored as $key => $items) {
$hasExpired = count(array_filter($items, function ($item) {
return strtotime($item['expire']) < time();
})) > 0;
if ($hasExpired) {
$expiredKeys[] = $key;
}
}
var_dump($expiredKeys);
输出:
array(2) {
[0] =>
int(111)
[1] =>
int(222)
}
答案 1 :(得分:0)
几个嵌套的foreach
循环是最有效的(IMHO),因为内部循环检查过期的条目。一旦找到一个密钥,它将标记整个密钥,然后移至下一个密钥。这样就不必处理所有条目,然后检查是否还有剩余...
$expired = [];
foreach ( $stored as $key => $main ) {
foreach ( $main as $sub ) {
if ( strtotime($sub['expire']) < time() ) {
$expired[] = $key;
break;
}
}
}
print_r($expired);
如果您只想要第一个过期的,请更改
break;
到
break 2;
,一旦找到过期的物品,它将立即停止两个循环。
答案 2 :(得分:0)
使用您的代码
// an array to hold all the expired dates
$expired = [];
$stored = array(
'111' => array(
0 => array(
'type' => 'first',
'expire' => date('Y-m-d H:i:s', strtotime('2019-08-01 08:00:00')),
),
1 => array(
'type' => 'second',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-01 09:00:00')),
),
),
'222' => array(
0 => array(
'type' => 'first',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-02 12:00:00')),
),
1 => array(
'type' => 'second',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-02 13:00:00')),
),
2 => array(
'type' => 'third',
'expire' => date('Y-m-d H:i:s', strtotime('2019-01-02 14:00:00')),
),
),
);
// Loop through the first/parent array
foreach($stored as $key => $val){
// Get the expire index only and store into variable for use in the inner loop
$expire_dates = array_column($val, 'expire');
// Loop through the inner arrays
foreach($val as $value){
// Convert the expire date from 'Y-m-d H:i:s' to unix timestamp, it is easier and better for date comparison
$expire = strtotime($value['expire']);
if($expire < time() ){
$expired[$key][] = $value['expire'];
}
}
}
// Now print all the expired array data
echo '<pre>';
print_r($expired);
预期输出:
Array
(
[111] => Array
(
[0] => 2019-01-01 09:00:00
)
[222] => Array
(
[0] => 2019-01-02 12:00:00
[1] => 2019-01-02 13:00:00
[2] => 2019-01-02 14:00:00
)
)