我有一个多维数组。单独数组的键是文本。我想知道如何匹配从循环SELECT数据的字符串的一部分的关键。
数组
示例Array ( [Volvo] => Array ( [0] => )
[Ford] => Array ( [0] => )
[Seat] => Array ( [0] => ) )
那么从这个数组$cars
中,我如何匹配来自SELECT
查询的数据
Select Output echo $row['car'];
沃尔沃、奔驰、雷克萨斯
我在找什么
如果其中一个数组的键与我的选择查询的字符串的一部分匹配,就像上面的例子所说的,Volvo将匹配,那么做一些事情。对我来说就是在数组中添加更多的数据
我已经尝试了in_array
, array_search
和array_filter
的变化,但没有找到适合我的解决方案。
通过foreach
循环的反向示例
$searchword = $array_element;
$result = array_filter($cars, function($var) use ($searchword) { return preg_match("/b$searchwordb/i", $var); });
取自:搜索包含字符串
这应该可以为您工作:
首先,我使用preg_split()
将您的搜索字符串(Volvo, Mercedes, Lexus
)拆分为一个数组。
正则表达式:
/s*,s*/
的意思是:
- s*匹配任何空格字符[rntf]
- 量词:*在0到无限次之间,尽可能多的次数,根据需要回馈[贪心]
- ,匹配字符,字面意思是
- s*匹配任何空格字符[rntf]
- 量词:*在0到无限次之间,尽可能多的次数,根据需要回馈[贪心]
这确保我们在字符串的搜索词中没有空格。这样我们就得到了这样一个数组:
Array
(
[0] => Volvo
[1] => Mercedes
[2] => Lexus
)
之后,我从你的数组和我们刚刚创建的搜索数组中取出array_intersect_key()
。
<?php
$arr = preg_split("/s*,s*/", $row["car"], -1, PREG_SPLIT_NO_EMPTY);
if(($intersect = array_intersect_key($cars, array_flip($arr)))) {
echo "Do stuff!";
print_r($intersect);
} else {
echo "Drink a cup of tea";
}
?>
输出:Array
(
[Volvo] => Array
(
[0] =>
)
)
有很多方法可以达到你的目标。我会使用函数explode()
将从数据库($row['car']
)检索到的数据分成块和trim()
,以确保识别的块没有填充空间:
$brands = array_map('trim', explode(',', $row['car']));
现在,print_r($brands)
应该显示一个数组,其值是示例数组中的候选键(下面称为$example
)。
接下来,这取决于您想要匹配的内容以及您想要如何处理匹配。
一个简单的识别可以使用array_intersect()
和$brands
以及示例数组的键(参见函数array_keys()
)来完成。
$common = array_intersect($brands, array_keys($example));
foreach ($common as $key) {
// Do something with $example[$key]
}
或者你可以直接遍历$brands
并检查值是否为$example
中的键:
foreach ($brands as $key) {
if (array_key_exists($key, $example)) {
// Do something with $example[$key]
}
}
您也可以使用isset($example[$key])
,而不是array_key_exists($key, $example])
。
尝试使用PHP stripos
,这是简单而有效的:
基础数据:
$array = Array ( [Volvo] => Array ( [0] => )
[Ford] => Array ( [0] => )
[Seat] => Array ( [0] => ) )
;
SQL data (string or array):
$row['car']; // string
$row //array of all SQL columns output
Foreach
with stripos
:
foreach($array as $rowKey=>$rowArray){
$rowKey = trim($rowKey);
foreach($row as $sqlRow=>$sqlArray){
$sqlRow = trim($sqlRow);
if (stripos($rowKey,$sqlRow) !== false){
///values are the same in this key in the array and in the SQL output
}
}
unset($sqlRow,$sqlArray);
}
unset($rowKey,$rowArray);
这可能不是最有效的,但应该会给你想要的结果