【问题标题】:Return multidimensional array value based on most recent date and another value根据最近的日期和另一个值返回多维数组值
【发布时间】:2015-12-14 17:02:13
【问题描述】:

我的代码基于以下链接: PHP Multidimensional Array Searching (Find key by specific value) 我尝试添加类似于 Get most recent date from an array of dates 的代码;但是我不断收到非法偏移错误。

我可以根据第一个代码成功选择正确的值。然后如何根据数组中的最近日期缩小我的回报范围?

我使用的是 php 5.4.45,我的数组总是按日期排序,最近的在最后。我不能简单地选择最后一个数组索引,因为它并不总是“已支付”订单状态。

我的数组:

array(4) { 
[0]=> array(3) { 
    ["status"]=> string(6) "Active" 
    ["check_number"]=> string(0) "" 
    ["date_added"]=> string(19) "17/11/2015 10:34:53" } 
[1]=> array(3) { 
    ["status"]=> string(4) "Paid" 
    ["check_number"]=> string(5) "12345" 
    ["date_added"]=> string(19) "14/12/2015 07:40:59" } 
[2]=> array(3) { 
    ["status"]=> string(8) "Invoiced" 
    ["check_number"]=> string(0) ""  
    ["date_added"]=> string(19) "14/12/2015 09:44:31" } 
[3]=> array(3) { 
    ["status"]=> string(4) "Paid" 
    ["check_number"]=> string(4) "0258" 
    ["date_added"]=> string(19) "14/12/2015 09:53:29" } 
} 

我的代码:

function getValue($fromSource, $field, $value, $get){
    if ($fromSource[$field] === $value) {
        return $fromSource[$get];
    };
    return false;
}
foreach ($order['order_history'] as $order_history) {
    var_dump(getValue($order_history, "status", "Paid", "check_number"));
}

所需结果:“0258”(其中状态 =“已支付”,日期 = 最近)

当前接收:“12345”“0258”(其中状态 =“已支付”)

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    我认为另一种可能性是使用foreach 构造循环您的数组,并检查迭代中的每个数组是否“状态”为“付费”。 然后每次迭代,您都可以使用DateTime 对象将当前$item 中的日期与$result 数组中的日期进行比较。

    例如:

    $items = array(
        array(
            "status" => "Active",
            "check_number" => "",
            "date_added" => "17/11/2015 10:34:53"
        ),
        array(
            "status" => "Paid",
            "check_number" => "12345",
            "date_added" => "14/12/2015 07:40:59"
        ),
        array(
            "status" => "Invoiced",
            "check_number" => "",
            "date_added" => "14/12/2015 09:44:31"
        ),
        array(
            "status" => "Paid",
            "check_number" => "0258",
            "date_added" => "14/12/2015 09:53:29"
        )
    );
    
    $result = array();
    
    foreach ($items as $item) {
        if ($item["status"] === "Paid") {
    
            // If there is no result yet with status "Paid", then add it.
            if (count($result) === 0) {
                $result = $item;
                continue;
            }
    
            $itemDateTime = DateTime::createFromFormat('d/m/Y H:i:s', $item["date_added"]);
            $resultDateTime = DateTime::createFromFormat('d/m/Y H:i:s', $result["date_added"]);
    
            if ($itemDateTime > $resultDateTime) {
                $result = $item;
            }
        }
    }
    
    var_dump($result);
    

    将导致:

    array (size=3)
      'status' => string 'Paid' (length=4)
      'check_number' => string '0258' (length=4)
      'date_added' => string '14/12/2015 09:53:29' (length=19)
    

    然后您可以像这样从$result 数组中访问您的值:

    echo $result["check_number"];
    

    将导致:

    0258

    Demo

    【讨论】:

      【解决方案2】:

      我们使用array_walk 收集所有日期。

      我们使用createFromFormatgetTimestamp 将日期转换为时间戳,因此我们可以轻松订购它们,不要忘记传递timezone

      我们得到最高时间戳的键,并用它来访问项目列表。

      $items 是初始数组。

      $dates = array();
      
      $format = 'd/m/Y H:i:s';
      $timezone = new DateTimeZone('UTC'); 
      
      array_walk($items,function($item,$index) use(&$dates,$format,$timezone){
          $date = DateTime::createFromFormat($format, $item["date_added"],$timezone);
          $dates[$index] = $date->getTimestamp();
      });
      
      // get the key of the most recent date
      $key = array_keys($dates, max($dates))[0];
      
      // using the key get the item from the list
      print_r($items[$key]) . PHP_EOL;
      

      会输出

      Array
      (
          [status] => Paid
          [check_number] => 0258
          [date_added] => 14/12/2015 09:53:29
      )
      

      从这里您可以轻松地只访问结果的一个元素

      print $items[$key]["check_number"];
      

      会输出

      0258
      

      【讨论】:

        【解决方案3】:

        如果数组总是排序的,你可以使用这段代码来获取匹配相应状态的最新条目:

            function getLatest($arr, $field, $value, $getField){
        
                for($i=count($arr)-1;$i >= 0; $i--){
                        $currSubArr = $arr[$i];
                        if($currSubArr[$field] === $value){
                            return $currSubArr[$getField];
        
                        }   
        
                }
            }
            $orders[] = array('status' => 'active', 'checknumber'=> '121234','date_added' => '17/11/2015 10:34:53');
            $orders[] = array('status' => 'paid', 'checknumber' => '1212334','date_added' => '17/11/2015 10:38:53');
            $orders[] = array('status' => 'paid', 'checknumber '=> '5234','date_added' => '17/11/2015 10:42:53');
        
        
        
          //test --> returns 5234 
            echo getLatest($orders,'status','paid','checknumber');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-13
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-14
          相关资源
          最近更新 更多