我需要识别一个数组(针)中的值出现在另一个数组(haystack)中的每个实例。 in_array()
似乎是我最好的选择,下面的代码可以完美运行,直到我需要在从db中获取的行上使用它 - 它会保持附加值,而不是每次调用时都设置它们。
虽然在这种情况下我实际上无法使用unset()
,但我很惊讶地发现即使这样也无法解决问题。
更新 - 返回的内容示例
我暂时更改了db值,以便$ needle只有每行的值(为了能够对填满我的屏幕的值进行排序; - )
- FALSE;
- FALSE;假;真;
- FALSE;假;真正;假;真;
- FALSE;假;真正;假;真正;假;真;
- FALSE;假;真正;假;真正;假;真正;假;
醇>
这可以正常使用 (我已发布功能示例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, '; ';
}
}
}
答案 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”]中的新数组(希望这有任何意义;看起来我很难解释什么是发生)。