【问题标题】:Get specific array value where another value is "1"?获取另一个值为“1”的特定数组值?
【发布时间】:2016-08-04 16:53:40
【问题描述】:

我有一个如下所示的数组:

    Id = "ADA001"
    Stock: 15

该数组有大约 1700 条看起来相同的记录,我将如何在数组中搜索 ID 1 并返回股票?

编辑:我需要访问这 17000 条记录中每一条的库存

编辑:我从 Daniel Centore 那里得到了一些帮助,他告诉我将数组主键设置为项目的 id 并且它等于库存,但我可以'让它工作。

我目前正在从 MySQL 数据库中获取数据并将其存储在一个数组中,如下所示:

       $data[] = array();
    $getdisposabletest = mysqli_query($connect, "Select id, disposable FROM products");      

while ($z = mysqli_fetch_array($getdisposabletest)) {  
    $data = $z;
}

现在当我使用如下所示的 Daniels 代码时:

    $myMap = [];
foreach($data as $item) {
    $myMap[$item['id']] = $item['disposable'];
}

当我尝试使用 ID“ADA001”回显我的产品时,它不会返回任何内容

  echo $myMap["ADA001"];

当我执行“count($mymap)”时,它说它的 2 条记录很大,什么时候应该比那个大得多?

感谢您的帮助

【问题讨论】:

  • 你能多分享一点数组结构吗
  • 如果 id 是唯一的,那么从长远来看,基于它们对数组进行索引以及解决这个特定问题是有意义的。
  • 使用array_filter(...)php.net/manual/en/function.array-filter.php,如果你确定ID是唯一的,使用current(array_filter(...))返回第一条记录。
  • @Anton 我忘了 ID 实际上是一个字符串。

标签: php mysql arrays


【解决方案1】:

编辑: 既然已经明确 OP 想要从数以千计的项目中进行查询,那么正确的做法是让 Id 成为 PHP 中映射的键,像这样:

$myMap = [];
foreach($array as $item) {
    $myMap[$item['Id']] = $item['Stock'];
}

现在,只要您想访问项目“12”,只需使用$myMap['12']

之所以更快,是因为算法复杂性。您应该阅读有关 Big-O 表示法的更多信息。本质上,这里的第一个操作是在n的顺序上,然后循环遍历出来的每个项目都是在n*log(n)的顺序上,所以最终的结果是在n*log(n)的顺序上,这是最好的无需更多信息,您就可以做到。但是,如果你只访问一个元素,那么只通过 MySQL 访问那个元素会更好,因为它的顺序是log(n),这样更快。

编辑 2: 另请注意,如果您要访问多个字段(不仅仅是股票),您可以执行以下操作:

$myMap = [];
foreach($array as $item) {
    $myMap[$item['Id']] = $item;
}

然后像这样访问项目 12 的库存:$myMap['12']['stock'] 或其名称如下:$myMap['12']['name']

【讨论】:

  • 是的,你是对的,我从表中获取项目,但我的系统比这复杂得多,我现在要解决的只是我系统的一小部分。
  • 如果假设我有 2000 件产品并且我需要获取每件商品的库存,这种方式是否更有效?一遍又一遍地查询数据库会有那么高效吗?
  • 不,那样不会更有效率。明确说明这是您在问题中想要做的,我会用正确的答案更新我的答案。
  • 这看起来不错,但是如果 id 是一个字符串,我该怎么做呢?这可能吗?
  • @user2750279 用字符串键更新了我的答案
【解决方案2】:

我会使用array_filter。返回比较器的结果。

$results = array_filter($targetArray, function($el) {
    return $el === 1;
});

【讨论】:

    【解决方案3】:

    你会做这样的事情。

    $newArray=[];
    foreach($array as $item){
        if($item['Id'] === 1){
            $newArray[] = $item;
        }
    }
    $stockArray = array_column($newArray,'Stock');
    

    【讨论】:

    • 如果测试 1 或 0,我当然会使用 ===
    • 不知道1是字符串还是整数
    • 对于包含 1700 个条目的数组,我建议将 id 作为数组的键
    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 2022-01-11
    • 2017-10-16
    • 1970-01-01
    • 2018-03-28
    • 2022-07-25
    • 2012-05-06
    相关资源
    最近更新 更多