Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更好的方法来构建具有搜索功能的PHP数组?_Php_Mysql_Arrays_Multidimensional Array - Fatal编程技术网

有没有更好的方法来构建具有搜索功能的PHP数组?

有没有更好的方法来构建具有搜索功能的PHP数组?,php,mysql,arrays,multidimensional-array,Php,Mysql,Arrays,Multidimensional Array,我经营一个网站,允许数百名客户在线销售产品。当客户访问我客户的某个网站时,他们会以 www.site.com?userid=12345 在登录页上,我们通过mysql查找用户ID为12345的客户的信息,以及他/她可以销售的产品列表。我们只提供一套约30种产品,我们对它们进行了定义,以便我们了解它们的外观,但并非所有客户都能以相同的价格提供。此信息的mysql表如下所示: userid | category | itemid | price ===========================

我经营一个网站,允许数百名客户在线销售产品。当客户访问我客户的某个网站时,他们会以

www.site.com?userid=12345

在登录页上,我们通过mysql查找用户ID为12345的客户的信息,以及他/她可以销售的产品列表。我们只提供一套约30种产品,我们对它们进行了定义,以便我们了解它们的外观,但并非所有客户都能以相同的价格提供。此信息的mysql表如下所示:

userid | category | itemid | price
=================================
12345  |    1     |  1     | 1.00
12345  |    1     |  2     | 2.00
12345  |    1     |  3     | 3.00
12345  |    2     |  4     | 4.00
12345  |    2     |  5     | 5.00
67890  |    1     |  1     | 2.25
67890  |    2     |  4     | 8.00
if (!empty($products[$foodid])) {
    echo "Food HTML part";
    if (!empty($products[$foodid][$cheeseid])) {
        echo "Cheese price = {$products[$foodid][$cheeseid]}";
    }
}
当客户访问www.site.com?userid=12345时,将使用以下内容进行查找:

SELECT category, itemid, price FROM tablename WHERE userid = 12345
*注意-是,我阻止sql注入

我遇到的问题是如何在PHP中构建后续数组。我最初的想法是:

<?php
...

while ($row = $stmt->fetch()) {
  $products[]['category'] = $row['category'];
  $products[]['itemid'] = $row['itemid'];
  $products[]['price'] = $row['price'];
}


//the array will end up looking like this:
Array
(
    [0] => Array
        (
            [category] => 1
            [itemid] => 1
            [price] => 1
        )
    [1] => Array
        (
            [category] => 1
            [itemid] => 2
            [price] => 2
        )
    [2] => Array
        (
            [category] => 1
            [itemid] => 3
            [price] => 3
        )
    [3] => Array
        (
            [category] => 2
            [itemid] => 4
            [price] => 4
        )
    [4] => Array
        (
            [category] => 2
            [itemid] => 5
            [price] => 5
        )
)

?>

我需要捕捉这样的信息的原因是:在实际的网站上,有两个主要类别(食物和饮料)。如果客户有$products类别为1的任何产品,请在页面上显示食品html部分。如果客户有$products类别为2的任何产品,请在页面上显示饮料html部分

然后,有一组预定义的ItemID可用于所有类别。就食品而言,有4种:

  • 意大利香肠
  • 香肠
  • 奶酪
  • 蔬菜
  • 如果用户没有这些ItemId之一,则他/她无法销售该产品,并且该产品不会出现在食品html部分中。如果他们能够销售该产品,我希望能够参考该部分/项目的价格,并将其显示在实际项目旁边

    我知道我的$products数组将包含我需要的所有信息,但我不确定我构建它的方式是否最好,或者在构建页面时如何真正引用它

    例如(我知道这段代码不正确,但说出了我要实现的目标):

    • 如果$products类别数组中存在值1,则显示食品部分
    • “如果$products itemid类别数组中的值为1,则在页面上显示意大利香肠比萨作为选项,并显示与特定类别/itemid组合关联的价格。”
    感谢您的指导

    $products[]['category'] = $row['category'];
    $products[]['itemid'] = $row['itemid'];
    $products[]['price'] = $row['price'];
    
    这将为每个属性创建一个新数组;使用

    $products[] = $row;
    

    …将行内容复制到products数组。

    我不确定是否按照您的要求执行了所有操作,但是当您在行中循环时,为什么不在那里进行类别检查呢

    //setup some flags
    $food  = false;
    $drink = false;
    
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //fetch an assoc array
      $products[] = $row;
      if(!$food AND 1 == $row['category']){ //haven't seen food yet, check for it
        $food = true;
      } elseif (!$drink AND 2 == $row['category']) { //same for drink
        $drink = true;
      }
    }
    
    //later
    if($food){
      //display food
    } 
    
    当然,与其直接跟踪这些标志,不如采用更通用的方法:

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //fetch an assoc array
      $products[] = $row;
      $categories[$row['category']] = true;
    }
    
    //later
    if(in_array(1, $categories)){
      //display food
    }
    
    但这仍有一点有待改进。这个怎么样:

    //use some OOP to make this cleaner (class constants)
    define('FOOD' , 1);
    define('DRINK', 2);
    
    //setup default values
    $categories = array(FOOD => false, DRINK = false);
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //fetch an assoc array
      $products[] = $row;
      $categories[$row['category']] = true;
    }
    
    //later
    if($categories[FOOD]){
      //display food
    }
    
    而且,如果我正确理解了您的问题,您可能只需要检查产品是否可用(使用产品id)-更改产品循环以跟踪该循环作为关键:

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //fetch an assoc array
      $products[$row['itemid']] = $row;
      $categories[$row['category']] = true;
    }
    
    //later
    if(isset($products[$searchId])){
      //user has this product
    }
    

    如果使用Zend,则可以使用itemid作为第一列执行$products=$query->fetchAssoc并获取数组 $products[itemid1]=>数组(itemid1,'类别','价格'), $products[itemid2]=>数组(itemid2,'类别','价格')

    但对于类别,我认为更好的解决方案是:

    $products[$row['category']][$row['itemid']] = $row['price'];
    
    所以你可以这样使用它:

    userid | category | itemid | price
    =================================
    12345  |    1     |  1     | 1.00
    12345  |    1     |  2     | 2.00
    12345  |    1     |  3     | 3.00
    12345  |    2     |  4     | 4.00
    12345  |    2     |  5     | 5.00
    67890  |    1     |  1     | 2.25
    67890  |    2     |  4     | 8.00
    
    if (!empty($products[$foodid])) {
        echo "Food HTML part";
        if (!empty($products[$foodid][$cheeseid])) {
            echo "Cheese price = {$products[$foodid][$cheeseid]}";
        }
    }
    
    我希望我能理解你的问题:)
    对不起我的英语

    谢谢feeela-我想这是有道理的(我也可以在上面的每次迭代中填充$I=1和+,以防我需要修改名称以使我更明白,但总体上是相同的概念)。我想我最大的问题是如何引用该数组中的值,以获得最后两个问题的结果。我认为您的构建是我第一次尝试要做的,但没有像您那样考虑itemid。我会考的。谢谢我希望没有零价格,因为如果(!empty($products[$foodid][$cheeseid]),如果您需要零价格使用,零价格食品将隐藏在这一行中。谢谢您的回答和洞察力。它确实给了我一些可以构建的东西,但我在这里得到了整体要点。@JM4当然-如果您有任何相关问题,请告诉我。现在没有时间真正回答,但是对于我在Stack Overflow上看到的大多数格式良好的问题+1。