如何通过键从多维数组获取父键

时间:2019-07-25 07:35:48

标签: php arrays multidimensional-array

我正在尝试获取其中'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在多维数组上不起作用。

3 个答案:

答案 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
        )

)