在对象数组中搜索特定键值对

时间:2016-12-15 13:40:02

标签: php

从mysql数据库中提取一些数据后将其保存到变量中,我想知道是否可以“查询”变量而不是对数据库做另一个请求?我意识到我需要根据键和值搜索一个对象数组。所以这是我所拥有的一个例子。

<?php
[{"customer":1,"item":1,"bought_at":"2016-12-15 11:41:11"},
{"customer":2,"item":1,"bought_at":"2016-12-15 11:43:21"},
{"customer":3,"item":1,"bought_at":"2016-12-16 13:31:11"},
{"customer":1,"item":2,"bought_at":"2016-12-16 12:12:21"},
{"customer":1,"item":3,"bought_at":"2016-12-17 15:13:58"}]
?>

所以我想说我需要根据物品编号和购买物品时的日期(而不是时间)进行搜索。下一步是将结果作为另一个对象数组返回。因此,如果我要搜索在2016-12-15购买的第1项,它将返回。

[{"customer":1,"item":1,"bought_at":"2016-12-15 11:41:11"}, 
{"customer":2,"item":1,"bought_at":"2016-12-15 11:41:21"},]   

这可能吗?如果是这样我怎么去做呢? 此致

编辑:我最初问这个问题的原因是因为我在一个嵌套的foreach循环中有一个查询,这让我感到困扰。这是一段代码,在后端构建一个json表,将信息传递到前端以绘制谷歌线图。我还在原始问题中略微更改了数据,以便更容易阅读。它也建在Laravel。完整的代码非常大,所以我只是发布嵌套的foreach循环。查询位于第二个循环中,并给出变量$ activations。

foreach ($timeRange as $time){
        $temp = array();
        $timeTwentyFour = date("G", strtotime($time));
        $temp[] = array('v' => "Date(01,01,2000,$timeTwentyFour)");

        foreach($data as $row){
            $count = 0;
            $activations = DB::table('customer_display')->where('display_id',$row->id)->where(DB::raw('DATE(created_at)'),$day)->get();

            foreach($activations as $activation){
                $timestamp = $activation->created_at;
                $activationTime = explode(" ", $timestamp)[1];

                if (strtotime($activationTime) >= strtotime($time) && strtotime($activationTime) < strtotime($time) + 3600){
                    $count++;
                };
            }
            $temp[] = array('v' => (float) $count);
            //The custom tooltip
            $temp[] = array('v' => $time . ' ' . $row->location . '. ' .  $count . ($count == 1 ? ' Activation' : ' Activations'));
        }
        $rows[] = array('c' => $temp);
    }

2 个答案:

答案 0 :(得分:0)

如果这些是数组中的对象,并且您只想要item1的条目,则可以使用array_filter;

$filtered = array_filter($items, function($item){
    // only return objects where this is true
    return $item->item == 1;
});

如果您只想购买15日购买的商品

return date('d', strtotime($item->bought_at)) == 15;

如果您想看到15日购买的商品1,请使用

$filtered = array_filter($items, function($item){
    return $item->item === 1
        && date('d', strtotime($item->bought_at)) == 15;
});

另请查看this answer on comparing dates以获取有关如何更好地执行此操作的详细信息。

答案 1 :(得分:0)

在大多数情况下,另一个数据库请求将是更好的方法。数据库已针对查询数据进行了优化。它可以使用索引等。像MySQL这样众所周知的数据库具有查询优化。手工完成效率会降低。 首先下载太多数据,然后使用像array_filter这样的内容来线性搜索所有数据的效率远低于仅使用查询中的搜索条件查询数据。

一种方法是:

//Prepare statement once
$statement = $pdo->prepare("SELECT * FROM table WHERE item = ? AND bought_at = ?");

$statement->execute(array(1, "2016-12-15"));
foreach ($statement->fetchAll() as $array)
    //Do something with $array

//reuse prepared statement with another selection criteria
$statement->execute(array(3, "2016-12-16"));
foreach ($statement->fetchAll() as $array)
    //Do something with $array