Php 如果在db行中循环,in_array()会不断追加值
我需要识别一个数组(指针)中的值出现在另一个数组(haystack)中的每个实例Php 如果在db行中循环,in_array()会不断追加值,php,mysql,arrays,Php,Mysql,Arrays,我需要识别一个数组(指针)中的值出现在另一个数组(haystack)中的每个实例in_array()似乎是我最好的选择,下面的代码工作得很好,直到我需要在从数据库获取的行上使用它为止——它会不断追加值,而不是每次调用时都设置值 虽然在这种情况下我实际上无法使用unset(),但我惊讶地发现,即使这样似乎也无法解决问题 更新-返回内容的示例 我临时更改了db值,使$TINERS每行只有一个值(以便能够对填充我屏幕的值进行排序;-)) 虚假的 虚假的;虚假的;是的 虚假的;虚假的;是的;虚假的;是
in_array()
似乎是我最好的选择,下面的代码工作得很好,直到我需要在从数据库获取的行上使用它为止——它会不断追加值,而不是每次调用时都设置值
虽然在这种情况下我实际上无法使用unset()
,但我惊讶地发现,即使这样似乎也无法解决问题
更新-返回内容的示例 我临时更改了db值,使$TINERS每行只有一个值(以便能够对填充我屏幕的值进行排序;-))
此操作正常运行 (我已经发布了一个功能示例) 这会不断添加值-编辑以反映我正在使用的代码
$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, '; ';
}
}
}
如果您希望第二个代码块执行第一个代码块(工作正常)所执行的操作,则第二个代码块应如下所示:
if ($stmt->columnCount()) {
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$needle =$row["product_var"];
$Match = "False";
if (in_array($needle, $haystack)){
$Match = "True";
}
}
}
您不需要使用foreach,因为在第二个块中,foreach被while循环所取代。不清楚您要做什么。但也许这会有帮助:
$customerCategories=array('Casual','Trendy');
如果($stmt->columnCount()){
而($row=$stmt->fetch(PDO::fetch\U ASSOC)){
$productCategoryRow=$row['TASTER_Category'];
//如果它不起作用,请尝试取消对下一行的注释
//$productCategories=[];
$PRODUCTCATEGORES=分解(',',修剪($productCategoryRow));
$match=“False”;
foreach($productCategories作为$productCategory){
if(在数组中($productCategory,$customerCategories)){
$match=“True”;
}
echo$匹配。“;”;
}
}
}
这会在每次循环完成时在屏幕上打印结果。这就是你的意思吗?我要试着解决这个问题。我认为问题在于:
$needles[]=$row["product_var"];
我认为这应该是:
$needles=$row["product_var"];
“product_var”列包含一个CSV(如您所述),因此我可以举一个如下示例:
$csv = "jake;john;alex;kim";
带括号($Piners[])的示例:
编辑(更多解释):
如果我使用print\r,我会看到数组正在扩展,这在您的示例中是如何发生的:
步骤1:it向$niels添加一个数组,其中包含值('jake'、'john'、'alex'、'kim')
步骤2:it向$Nikes添加一个数组,因此它包含2倍的值('jake'、'john'、'alex'、'kim')
步骤3:it向$Nikes添加一个数组,因此它包含3倍的值('jake'、'john'、'alex'、'kim')
等等
现在没有支架($针):
每次数组只包含值('jake'、'john'、'alex'、'kim')——这就是您想要的
这能解释“不断扩大的价值观”吗?(或者我只是在做一些与你的问题无关的蠢事??)
编辑:
如果这就是问题所在,那么您将添加到数组中,而不是仅使用$row[“product_var”]中的新数组(希望这有意义;我似乎不太擅长解释发生了什么) 为什么不呢
$Match
没有以任何方式使用。哪些值附加到哪个数组?我不明白,为什么要收集所有指针,为什么不使用单个指针在该数组中进行搜索?如果我读对了,您有一个表,其中有一列名为“product_var”,而这个“product_var”包含一个数组(?)。与第一个示例相比,还有更多的内容(它是一个表,其中一列包含一个数组)。不是每个“产品”都是针吗?(与第一个示例相比,它不是一组针)@hobbs-我只是想保持代码的整洁:-)显然我在使用它;-)目前,我只是简单地打印这些值,以确保它正常工作,一旦它工作,我将把它与一大块代码结合起来,这将允许我根据匹配的属性为产品建议分配权重,这些属性修复了“附加”问题,但它也停止了更新$Match的值(因为第一个返回'False'它们都等于'False')我也编辑了答案来解决你的第二个问题。我喜欢你的代码有多整洁:-D,但遗憾的是,它仍然导致同样的问题:-(事实上,我意识到我的编辑没有改变任何东西:D,但是,我认为两个版本的答案在逻辑上都是正确的。你什么时候真正检查或返回$Match的值?@ChayaCooper你能解释一下什么“一直在追加值”吗意思是?也许会显示$haystack和您的表的实际内容?我认为这个答案应该有效,因此示例和“真实内容”之间肯定有一些重要区别。遗憾的是,仍然不断追加最新的$match值“追加最新的$match值”是什么意思?如果指针不在干草堆中,您希望循环停止吗?或者您正在if块中执行匹配为真的操作吗?因为$match=“true”没有附加任何内容。可能您的真实代码包含类似$match的内容。=“true”?没有,但我可以在捕获一些zzz后发布完整的代码(现在是早上6点;-))是的,请。我想这会有帮助:)遗憾的是,这也阻止了它将当前值添加到$match
$csv = "jake;john;alex;kim";
for($i=0; $i<5; $i++) {
$needles[] = explode(";", $csv);
echo(count($needles).", ");
}
1, 2, 3, 4, 5,
for($i=0; $i<5; $i++) {
$needles = explode(";", $csv);
echo(count($needles).", ");
}
4, 4, 4, 4, 4,