2013-04-10 89 views
3

我把这个放入一个表列表中,它的作用是第一个函数填充前三行,然后第二个函数根据第一个函数的匹配填充第四行。函数foreach只返回最后一个数组

public function function1($start = 0, $max = 10, $use_result = false) { 

    $sql = 'SELECT itemnum, descrip FROM TABLENAME 
       WHERE itemnum LIKE "__-_____" 
       AND cms_item_id IS NULL 
       ORDER BY itemnum ASC 
       LIMIT ' . (int)$start . ',' . (int)$max .''; 
    $result = $this->registry->db->query($sql); 

    $return = array(); 
    while($row = $result->fetch_assoc()) { 
     $return[] = $row; 
    } 
    return $return; 
} 

/** 
* Get matches 
* @return array 
*/ 
public function function2(){ 
    $product = $this->getList(); 
    foreach($product as $key) { 
     $sku = $key['itemnum']; 
     list(, $sku) = explode("-", $sku); 
      } 

    $sql = 'SELECT product_sku, long_name 
    FROM TABLENAME 
     WHERE product_sku = "' . $sku . '"'; 
    $result = $this->registry->db->query($sql); 
    $return = array(); 

    while($row = $result->fetch_assoc()) { 
     $return[] = $row; 
     } 
    return $return; 
} 

发生了什么事是3行正在返回罚款。但第四行只返回最后一个$ sku没有任何匹配。我知道foreach循环每次都在覆盖,最后一个循环被放入变量$ sku中......但我还能怎么做才能得到我需要的?

+0

'foreach'依赖于'$产品= $这个 - > getList();'whish不包含在你的代码 – Baba 2013-04-10 19:44:40

+0

@Baba我怀疑'function1'是'getList'。 – Barmar 2013-04-10 19:47:04

+0

对不起,我试图删除我认为是私人信息的东西..忘了那个哈哈..但是是所有的功能和表名都是正确的在我身边只是上面提到的问题..谢谢! – Lynx 2013-04-10 19:49:42

回答

0

制作一个所有SKU的阵列,并使用IN而不是=来匹配它们。

public function function2(){ 
    $product = $this->getList(); 
    $skus = array(); 
    foreach($product as $key) { 
     $sku = $key['itemnum']; 
     list(, $sku) = explode("-", $sku); 
     $skus[] = $sku; 
    } 
    $sku_string = implode(', ', array_map(function($x) {return "'$x'"; }, $skus)); 
    $sql = 'SELECT product_sku, long_name 
      FROM TABLENAME 
      WHERE product_sku IN (". $sku_string .")'; 
    $result = $this->registry->db->query($sql); 
    $return = array(); 

    while($row = $result->fetch_assoc()) { 
     $return[] = $row; 
    } 
    return $return; 
} 

也许一个更好的解决方案将是您的查询合并为一个:

SELECT itemnum, descrip, long_name 
FROM table1 t1 
JOIN table2 t2 ON t2.product_sku = substring_index(itemnum, '-', -1) 
WHERE itemnum LIKE "__-_____" 
AND cms_item_id IS NULL 
ORDER BY itemnum ASC 
LIMIT ' . (int)$start . ',' . (int)$max 
+0

重复的行似乎没有工作。你有一个缺失)的内存,但在while循环产生所需的结果之前转储$ sku_string。然而,在while循环内部转储它什么都不会产生。我有一个while循环中被使用foreach循环的Smarty {\t \t \t \t {$的foreach作为匹配$行} \t \t \t \t \t {$ row.product_sku}模板设置| {$ row.long_name} \t \t \t \t {/ foreach}} – Lynx 2013-04-10 20:07:39

+0

这就是主要的“文件”$ this-> smarty-> assign('match',$ match); .... $ match = $ this-> display-> getProductMatch(); – Lynx 2013-04-10 20:09:02

+0

如果没有更多的上下文,很难说清楚什么是正确的,那就是像这样消除问题的问题。也许你需要在'foreach'循环中嵌套查询和'while'循环。 – Barmar 2013-04-10 20:13:21

0

试试这个:

public function function2(){ 
    $product = $this->getList(); 

    $sku = array();    //Make an empty $sku array 
    foreach($product as &$key) { 
     $sku = $key['itemnum']; 
     list(, $sku) = explode("-", $sku); 
     $key['sku'] = $sku; 
     $skus[] = $sku; 
    } 
    $selectValues = implode(',', $skus); 

    $sql = "SELECT product_sku, long_name FROM TABLENAME WHERE product_sku IN($selectValues)"; 
    $result = $this->registry->db->query($sql); 
    $return = array(); 

    $long_names = array(); 
    while($row = $result->fetch_assoc()) { 
     $long_names[$row['product_sku']] = $row['long_name']; 
    } 

    foreach ($product as &$key) { 
     $key['long_name'] = $long_names[$key['sku']]; 
    } 
    return $product; 
} 
+0

错误:致命错误:调用一个非对象的成员函数fetch_assoc()...我需要在那里爆炸这也是如何匹配 – Lynx 2013-04-10 20:13:28

+0

$ sql在这个函数中看起来如何? (如果你回应它) – bestprogrammerintheworld 2013-04-10 20:15:24

+0

它没有引用SKU,所以它可能会出现语法错误。 – Barmar 2013-04-10 20:15:33

相关问题