PHP - 在多维数组中搜索值并返回其ID

时间:2016-07-17 18:49:27

标签: php arrays multidimensional-array

我通过创建服装店来练习php。

考虑我的PHP数据库阵列:

$mens[101] = [
    "title" => "Block Original T-Shirt",
    "img" => "img/clothing/men/tShirts/block-orig-black.jpg",
    "price" => 16,
    "color" => "black",
    "altColor" => array("black" , "white", "grey"),
    "size" => array (
        array(
            "size" => "x-small",
            "qty" => 3
        ),
        array(
            "size" => "small",
            "qty" => 10
        ),
        array(
            "size" => "medium",
            "qty" => 0
        ),
        array(
            "size" => "large",
            "qty" => 15
        ),
        array(
            "size" => "x-large",
            "qty" => 9
        )
    ),
    "description" => "Duis eget volutpat mauris, quis lacinia orci. Cras mattis bibendum lorem, nec faucibus ipsum fermentum at. Nulla tincidunt ligula suscipit elit tincidunt, non vulputate nibh dapibus. Proin quis sapien hendrerit, vulputate nibh sit amet, rutrum quam.",
    "category" => "m-tShirts"
];

$mens[102] = [ ....]
$mens[103] = [ ....]
$mens[...

批准了一个新手问题,但是我在数据库中循环搜索那些类别=" m-shirts"的项目,一旦找到这些我想选择一个随机项目与这些结果合作。

foreach($mens as $sug) {
    if ($sug["category"] === "m-shirts") {
        echo key($mens);
    }
}

我使用echo来检查是否正在收集正确的ID。然而这回声" 101" 15次(具有类别" m-shirts"的产品数量)。但是我想要那些特定结果的唯一ID(巧合的是ID' 201到215)。用英语我想:

foreach(product in $mens array){
     if(product has the category "m-shirts"){
           collect the id's;
           select a random id and store as variable $suggestion
     }
}

如果有人可以帮助我或指导我指导任何文章/教程。我下午花了大部分时间浏览php文档,并且还学习了PHP,MySQL和JavaSript(Robin Nixon)关于数组的章节,但没有能够解决这个问题。

提前致谢!

6 个答案:

答案 0 :(得分:1)

不要滚动自己的过滤器,而是使用PHP:array_filter

$mTShirts = array_filter($mens, function($item) {
        return $item['category'] == 'm-tShirts';
    });

通过它,您可以按照您需要的方式访问结果,包括foreach或通过一些面向集合的方法,例如array functionsiterators。在这种情况下,array_rand可用于选择随机数组元素。

$idx = array_rand($mTShirts);
$item = $mens[$idx];

在编写操作之前,手册应该是您的第一站。 SPL特别有许多有用的类和&函数,但不要忽略整个function reference(不再是一个准确的名称,因为列出了许多类;“扩展接口参考”更准确)。

然而,这引出了一个问题:是在PHP中实现数据存储还是使用外部数据库,而外部数据库已经为标准操作提供了安全,高效的实现。你写的任何内容都有责任:

  1. 效率低下,
  2. be buggier,
  3. 功能较少,
  4. 花费宝贵的开发时间来设计和实施

答案 1 :(得分:0)

您可以像在第一个Foreach循环中一样循环遍历Shop-Items数组。然后创建一个数组来保存属于“m-shirts”类别的ID产品。在循环中,您只需将此类产品的所有ID都推送到创建的阵列变量即可。之后,您可以生成0到ID数组长度减去1之间的随机数。使用此随机数,您可以选择一个ID ....

    <?php

        // CREATE AN ARRAY TO HOLD THE IDS OF PRODUCTS UNDER THE CATEGORY: m-shirts     
        $mShirtsCatIDS  = array();

        // LOOP THROUGH THE SHOP ITEMS IN SEARCH OF PRODUCTS WITH CATEGORY: m-shirts
        foreach($mens as $id=>$men){
            // IF FOUND, PUSH THE ID TO THE $mShirtsCatIDS ARRAY
            if($men['category'] == 'm-shirts'){
                // PUSH THE IDs TO THE $mShirtsCatIDS ARRAY
                $mShirtsCatIDS[]    = $id;
            }
        }

        // IF OUR ARRAY OF IDs IS NOT EMPTY; JUST GENERATE A RANDOM NUMBER
        // BETWEEN 0 AND THE LENGTH OF THE ARRAY MINUS 1.
        // USING THAT GENERATED RANDOM NUMBER, PICK OUT ONE ID...       
        if(count($mShirtsCatIDS)>0){
            // GENERATE THE RANDOM NUMBER...
            $randNum    = rand(0, (count($mShirtsCatIDS) - 1));

            // PICK OUT AN ID, USING THIS RANDOM NUMBER...
            $randID     = $mShirtsCatIDS[$randNum];
            // END OF STORY..... ;-) 
        }

        var_dump($randID); //<== DUMPS A NEW ID EACH TIME.

        // YOU CAN NOW GET THE PRODUCT CORRESPONDING TO THIS ID
        // LIKE SO: $mens[$randID].... 

查看模拟演示HERE

希望您在此处找到任何有用的信息。

干杯&amp;祝你好运....

答案 2 :(得分:0)

正如@firstone所说,我认为你的具体问题的答案是使用:

$results = [];
foreach($mens as $key => $value) {
    if ($value["category"] === "m-shirts") {
        $results[] = $key;
    }
}

# view all results: // print_r($results);

// get random key from results:
$rand_item = array_rand($results);

echo $results[$rand_item];

答案 3 :(得分:0)

如果您想要的是一个具有类别m-shirts的随机数组,那么我会这样做:

shuffle($mens);
$cats   = array_column($mens, null, 'category');
$result = $cats['m-shirts'];
  • 随机播放阵列(随机化)
  • 获取使用category索引的数组(每个类别只有一个,因为它们必须是唯一索引)
  • 使用索引为m-shirts
  • 的数组

或更短:

shuffle($mens);
$result = array_column($mens, null, 'category')['m-shirts'];

答案 4 :(得分:-1)

尝试php array_search函数。有关更多信息,请检查此网址: function.array-search

答案 5 :(得分:-1)

在foreach上方建立一个数组,以收集迭代结果。

使用提供的中间代码块;但改变一点点。看起来你在数组中有一个数组,但在if测试中只有一个单独的迭代和检查。要么进行另一轮迭代以覆盖下一层数组键,要么将if测试更改为专门想要的那一个键。该区域中的var_dump可以帮助您更好地调试和开发该部分。

也就是说,很难将其扩展到一个抽象的命名层,而不是用于描述迭代最外层循环的命名。

在传递if测试后的括号中,将“id”值添加到保持数组中。通过这种方式,您可以收集发现的所有ID。如果id在一个名为key的变量中,那么只需将其添加到like:

$holder[] = $key;

或类似。