如果循环遍历db行,in_array()会保持附加值

时间:2014-09-30 06:59:26

标签: php mysql arrays

我需要识别一个数组(针)中的值出现在另一个数组(haystack)中的每个实例。 in_array()似乎是我最好的选择,下面的代码可以完美运行,直到我需要在从db中获取的行上使用它 - 它会保持附加值,而不是每次调用时都设置它们。

虽然在这种情况下我实际上无法使用unset(),但我很惊讶地发现即使这样也无法解决问题。


更新 - 返回的内容示例

我暂时更改了db值,以便$ needle只有每行的值(为了能够对填满我的屏幕的值进行排序; - )

  
      
  1. FALSE;
  2.   
  3. FALSE;假;真;
  4.   
  5. FALSE;假;真正;假;真;
  6.   
  7. FALSE;假;真正;假;真正;假;真;
  8.   
  9. FALSE;假;真正;假;真正;假;真正;假;
  10.   

这可以正常使用 (我已发布功能示例here

$needles = array('John', 'Alex');
$haystack = array('John','Alexander','Kim', 'Michael');

    foreach ($needles as $needle) {
        if (in_array($needle, $haystack) ) {
            $Match = 'True'; 
        }
        else {
            $Match = 'False'; 
        }
    }

这会保留附加值 - 编辑以反映我使用的代码

$Customer_Categories_Arr = array('Casual','Trendy'); 

if ($stmt->columnCount()) {            
  while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {    
     $Product_Categories_Arr[]=$row["Taste_Category"];          
      // Use when column contains CSV
      // $Product_Categories_Arrx = explode(',', trim($Product_Categories_Arr[0]));          
      foreach ($Product_Categories_Arr as $Product_Category_Arr) {          
              if (in_array($Product_Category_Arr, $Customer_Categories_Arr)){   
                  $Matches_Product_Category = "True"; 
              } else {                                 
                  $Matches_Product_Category = "False";  
              }           
                  echo $Product_Category_Arr, ', ', $Matches_Product_Category, '; ';
        }   
   }
}

3 个答案:

答案 0 :(得分:1)

你要做的事情并不是很清楚。但也许这会有所帮助:

$customerCategories = array('Casual', 'Trendy');
if( $stmt->columnCount() ){
    while( $row = $stmt->fetch( PDO::FETCH_ASSOC )){
        $productCategoryRow = $row[ 'Taste_Category' ];
        // If it is not working, try uncommenting the next line
        // $productCategories = [];
        $productCategories = explode( ',', trim( $productCategoryRow ));

        $match = "False";
        foreach( $productCategories as $productCategory ){
            if( in_array( $productCategory, $customerCategories )){
                $match = "True";
            }
            echo $match . ";";
        }
    }
}

每次循环完成后,都会在屏幕上打印结果。这是你的意思吗?

答案 1 :(得分:0)

如果您希望第二个代码块执行第一个代码块(正常工作),那么第二个块应该如下所示 -

if ($stmt->columnCount()) {
   while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {   
       $needle =$row["product_var"];              
       $Match = "False";  
        if (in_array($needle, $haystack)){   
            $Match = "True"; 
        }                  
    }
}

你不需要使用foreach,因为它被第二个块中的while循环所取代。

答案 2 :(得分:0)

我打算尝试解决这个问题。我认为问题在于:

$needles[]=$row["product_var"];

我认为这应该是:

$needles=$row["product_var"];

列“product_var”包含CSV(如您所述),所以我可以这样做一个例子:

$csv = "jake;john;alex;kim";

带括号的示例($ needle []):

for($i=0; $i<5; $i++) {
    $needles[] = explode(";", $csv);
    echo(count($needles).", ");
}

返回:

1, 2, 3, 4, 5,

编辑(更多解释):

如果我使用print_r,我会看到数组正在扩展,具体如何在你的例子中发生:

第1步:为$ needle添加数组('jake','john','alex','kim')

第2步:将数组添加到$ needle,因此它包含2倍的值('jake','john','alex','kim')

第3步:将数组添加到$ needle,因此它包含3倍的值('jake','john','alex','kim')

现在没有括号($ needle):

for($i=0; $i<5; $i++) {
    $needles = explode(";", $csv);
    echo(count($needles).", ");
}

返回:

4, 4, 4, 4, 4,

每次数组只包含值('jake','john','alex','kim') - 这就是你想要的。

这可以解释“扩大价值”吗? (或者我只做一些与你的问题毫无关系的愚蠢事情?)

修改

如果出现问题,那么你要添加一个数组,而不是只使用$ row [“product_var”]中的新数组(希望这有任何意义;看起来我很难解释什么是发生)。