【问题标题】:PHP multidimensional array returns empty subarraysPHP多维数组返回空子数组
【发布时间】:2026-01-08 20:25:02
【问题描述】:

我正在使用 php 从 mysql 数据库中使用一组值提取数据。

我的初始数组 $models 是一个零件编号列表,如下所示:

 Array ( 
         [0] => AB-1 
         [1] => AB-2 
         [2] => BCA-2 
         [3] => DE3 
 ) 

这是设置我的数据的 foreach,以便我可以在模板页面上显示产品:

$products = array();

 foreach ($models as $key => $prod_num) {
        $product_info = $this->model_extension_news->getModelInfo($prod_num);
        if ($product_info['image']) {
                            $image = $this->model_tool_image->resize($product_info['image'], $this->config->get('config_image_wishlist_width'), $this->config->get('config_image_wishlist_height'));
                        } else {
                            $image = false;
                        }

                        if ($product_info['quantity'] <= 0) {
                            $stock = $product_info['stock_status'];
                        } elseif ($this->config->get('config_stock_display')) {
                            $stock = $product_info['quantity'];
                        } else {
                            $stock = $this->language->get('text_instock');
                        }

                        if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
                            $price = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
                        } else {
                            $price = false;
                        }
            $products[] = array(
                            'product_id' => $product_info['product_id'],
                            'thumb'      => $image,
                            'name'       => $product_info['name'],
                            'model'      => $product_info['model'],
                            'stock'      => $stock,
                            'price'      => $price,     
                            'href'       => $this->url->link('product/product', 'product_id=' . $product_info['product_id']),

                        );

                }   

我访问数据库以从名为 getModelInfo() 的函数中查找 $product_id 和其他信息(我使用的是 opencart 框架):

public function getModelInfo($prod_num){
    $query = $this->db->query("SELECT p.product_id, pd.name AS name, p.model AS model, p.image, p.price, p.quantity FROM " . DB_PREFIX ."product p LEFT JOIN ".DB_PREFIX."product_description pd ON p.product_id = pd.product_id WHERE p.model = '".$prod_num."'");
         return array(
                        'product_id'       => $query->row['product_id'],
                        'name'             => $query->row['name'],
                        'model'            => $prod_num,
                        'image'            => $query->row['image'],
                        'price'            => $query->row['price'],
                        'quantity'         => $query->row['quantity'],
                         );
    }

问题是我的返回数组不完整。第一个结果已填写,但其他结果从数据库返回空白信息。我知道数据库中有这些产品的数据......我不明白为什么我的 $products 数组中的最后 3 个产品没有显示数据:

Array ( 
        [0] => Array ( 
              [product_id] => 18713 
              [thumb] => http://www.website.com/image/AB-1.jpg 
              [name] => AB-1 FULL 
              [model] => AB-1 
              [stock] => 79 
              [price] => $168.00 
              [href] => http://www.website.com/index.php?route=product/product&product_id=18713 
        ) 
         [1] => Array ( 
               [product_id] => 
               [thumb] => 
               [name] => 
               [model] => AB-2 
               [stock] => 
               [price] => 0 
               [href] => http://www.website.com/index.php?route=product/product&product_id= 
        ) 
         [2] => Array ( 
               [product_id] => 
               [thumb] => 
               [name] => 
               [model] => BCA-2
               [stock] => 
               [price] => 0 
               [href] => http://www.website.com/index.php?route=product/product&product_id= 
        ) 
         [3] => Array ( 
               [product_id] => 
               [thumb] => 
               [name] => 
               [model] => DE-3 
               [stock] => 
               [price] => 0 
               [href] => http://www.website.com/index.php?route=product/product&product_id= 
        ) 
)

我在这里缺少什么?我在 foreach 中做错了吗?还有其他方法可以设置 $products 吗?我似乎看不出这段代码出了什么问题。感谢您提供任何帮助(或重定向到此问题的已解决版本)!

【问题讨论】:

  • 您正在执行左连接,这意味着结果必须满足单个表。尝试使用完整的 JOIN(两个表),然后是 RIGHT JOIN(单个表但另一侧)。
  • 我刚刚尝试了 JOIN、INNER JOIN 和 RIGHT JOIN。返回的结果没有区别...
  • 在第一次 foreach 之前定义 $products = array();然后试试?
  • 我的完整功能中有这个。 (我没有发布整件事,因为它有一堆不相关的东西)。我会把它添加到 sn-p 中。
  • 检查您的数据是否有一致的值。您正在加入产品 id ON p.product_id = pd.product_id WHERE p.model = '".$prod_num."'" 这意味着所有产品都必须具有 id 和模型,对于调用的查询字段,任何字段都不能为空

标签: php mysql arrays multidimensional-array opencart


【解决方案1】:

您是否有可能缺少某些产品的产品描述?在这种情况下,您的“LEFT JOIN”不会为您返回该产品的结果。您需要使用:“LEFT OUTER JOIN”(点击此链接了解它的作用:SQL LEFT OUTER JOIN)。

已经在您的查询中添加了它:

$query = $this->db->query("
SELECT 
    p.product_id, pd.name AS name, p.model AS model, p.image, p.price, p.quantity 

FROM 
    " . DB_PREFIX ."product p 

LEFT JOIN
    ".DB_PREFIX."product_description pd ON p.product_id = pd.product_id WHERE p.model = '".$prod_num."'");

【讨论】:

  • 所有产品都有名称和描述。我已经在使用 LEFT JOIN。我只是输入了 LEFT OUTER JOIN 并没有什么不同。我也测试了 JOIN、INNER JOIN 和 RIGHT JOIN,没有任何改变。我也尝试了 FULL OUTER,只是想看看发生了什么——这破坏了一切。