【问题标题】:Array condition in php if the variable exist in an array如果变量存在于数组中,则php中的数组条件
【发布时间】:2020-01-14 23:09:02
【问题描述】:

我正在创建一个函数来返回一个日期,其中我有一个包含对象的数据数组,我想在单独的数组中插入与状态为 1 和 2 的数据数组相同的日期。

这是我的数组对象数据:

Array ( [0] => stdClass Object ( [time] => 2019-09-09 09:00:00 [status] => 1 )
        [1] => stdClass Object ( [time] => 2019-09-09 17:00:00 [status] => 2 ) 
        [2] => stdClass Object ( [time] => 2019-09-10 09:00:00 [status] => 1 )
        [3] => stdClass Object ( [time] => 2019-09-10 17:00:00 [status] => 2 )
        [4] => stdClass Object ( [time] => 2019-09-11 09:00:00 [status] => 1 )
        [5] => stdClass Object ( [time] => 2019-09-11 17:00:00 [status] => 2 )
        [6] => stdClass Object ( [time] => 2019-09-12 09:00:00 [status] => 1 )
        [7] => stdClass Object ( [time] => 2019-09-13 09:00:00 [status] => 1 )
)

我想返回类似这样的数组:

Array [0] 2019-09-09
      [1] 2019-09-10
      [2] 2019-09-11

我从数据库中得到这个结果。

【问题讨论】:

  • 那么你尝试了什么?
  • 如果这是数据库查询的输出,那么在查询中执行它也一样容易。
  • @EternalHour 我不知道先做什么,我可能认为我可以使用名为 in_array() 的函数?但我发现我不能因为状态
  • @Nick 我正在考虑一个查询,但我认为如果我有多个确切日期并且状态相同,我无法过滤日期
  • 那么你想把不同状态的对象分成不同的数组吗?

标签: php mysql sql arrays object


【解决方案1】:

您可以使用array_map() 函数,这是您的代码示例

$dateArray = ( [0] => stdClass Object ( [time] => 2019-09-09 09:00:00 [status] => 1 )
        [1] => stdClass Object ( [time] => 2019-09-09 17:00:00 [status] => 2 ) 
        [2] => stdClass Object ( [time] => 2019-09-10 09:00:00 [status] => 1 )
        [3] => stdClass Object ( [time] => 2019-09-10 17:00:00 [status] => 2 )
        [4] => stdClass Object ( [time] => 2019-09-11 09:00:00 [status] => 1 )
        [5] => stdClass Object ( [time] => 2019-09-11 17:00:00 [status] => 2 )
        [6] => stdClass Object ( [time] => 2019-09-12 09:00:00 [status] => 1 )
        [7] => stdClass Object ( [time] => 2019-09-13 09:00:00 [status] => 1 )

)

$data = array_map('foo',$dateArray);
var_dump($data);
function foo($data){
    if($data->status == 1){
        return $data->time;
    }
}

var_dump(array_filter($data,'strlen'));

输出是

array(3) {
  [0]=>
  string(19) "2019-09-13 07:16:33"
  [2]=>
  string(19) "2019-09-13 07:16:33"
  [5]=>
  string(19) "2019-09-13 07:16:33"
}

【讨论】:

  • 不,这不是输出的内容...3v4l.org/Zklmc 你只得到状态为 1 的位置。OP 询问数据集在哪里具有与状态 1 和状态 2 匹配的日期。跨度>
【解决方案2】:

如果您始终希望状态为12,您可以运行查询,选择DISTINCT 值,在列上使用DATE()。然后检查日期是否同时具有状态 1 和 2。

请注意,如果您可能拥有很多状态,则此解决方案无法很好地扩展 - 那么您应该考虑另一种方法。

SELECT DISTINCT DATE(t.time) AS time
FROM myTable t
JOIN myTable t2 
  ON DATE(t.time) = DATE (t2.time)
WHERE t.status = 1
  AND t2.status = 2
ORDER BY t.time

桌子

CREATE TABLE myTable (
  time DATETIME,
  status SMALLINT
);

INSERT INTO myTable VALUES
('2019-09-09 09:00:00', 1),
('2019-09-09 17:00:00', 2),
('2019-09-10 09:00:00', 1),
('2019-09-10 17:00:00', 2),
('2019-09-11 09:00:00', 1),
('2019-09-11 17:00:00', 2),
('2019-09-12 09:00:00', 1),
('2019-09-13 09:00:00', 1);

产生结果

2019-09-09
2019-09-10
2019-09-11

【讨论】:

  • 哇!很好的答案。顺便说一句,如果我有这样的情况怎么办,例如。我有多个相同日期的状态 1,我想忽略第二个数据。
【解决方案3】:

除了我比较喜欢的DB查询方案,这是一个PHP方案

$dateArray = [
    ["time" => "2019-09-09 09:00:00", "status" => 1 ],
    ["time" => "2019-09-09 17:00:00", "status" => 2 ], 
    ["time" => "2019-09-10 09:00:00", "status" => 1 ],
    ["time" => "2019-09-10 17:00:00", "status" => 2 ],
    ["time" => "2019-09-11 09:00:00", "status" => 1 ],
    ["time" => "2019-09-11 17:00:00", "status" => 2 ],
    ["time" => "2019-09-12 09:00:00", "status" => 1 ],
    ["time" => "2019-09-13 09:00:00", "status" => 1 ]
];

$finalArray = [];

foreach($dateArray as $obj){
    //$obj is actually an array
    $date = new \DateTime($obj["time"]);
    $date = $date->format("Y-m-d");
    if (isset($finalArray[$date])){
        if ($obj["status"] == 1 && $finalArray[$date] === 2)  $finalArray[$date] = $obj;
        if ($obj["status"] == 2 && $finalArray[$date] === 1)  $finalArray[$date] = $obj;
    } else {
        $finalArray[$date] = ($obj["status"] == 1 ? 1 : 2);
    }

}


foreach($finalArray as $key => $obj){
    if (!is_array($obj)){
        unset($finalArray[$key]);
        continue;
    }
    echo $key . "\n";
}

//var_dump($finalArray);

这个输出

2019-09-09
2019-09-10
2019-09-11

现场演示https://3v4l.org/UuUVB

注意:此解决方案已针对您在问题中的情况进行了调整,例如,它假设状态仅为 1 或 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多