我已经尝试了所有可以想象的东西,但是当我从db值动态创建一个数组时,我似乎无法正确地格式化它以使用in_array()
。我认为这个问题只是需要用引号括住每个值,因为我可以毫不费力地将in_array()
与硬编码数组一起使用,只要它采用这种方式进行格式化,但我没有&#39 ; t。能够使用explode
或implode
添加引号。
我尝试做的事情:这是我尝试过的一个非常简单的示例,即基于如何过滤查询的结果一个产品符合客户偏好列表(没有注射风险,我已尝试使用和不使用PDO)。
我知道有几个非常相似的帖子,但是花了更多的时间比我更愿意承认尝试实施每个教程并发布我已经看到过,我决定是时候转向社区寻求帮助。
in_array()声明
$Color='Black';
if (in_array($Color, $colors_love_Arrays)) {
echo "Matches: ", $Color;
}
查询形成数组
$colors_love_Array = array();
$result = mysql_query("SELECT * FROM style WHERE style.user_id = $user_id") or die(mysql_error());
while ($row_profile = mysql_fetch_array($result)) {
// I've tried both of these, both separately and together
$colors_love_Array[] = $row_profile['colors_love'];
$colors_love_Array = explode('",', $row_profile['colors_love']);
}
我需要如何构建数组
$colors_love_Array = array('Black','Charcoal','Light_Gray','White','Royal_Blue','Dodger_Blue','Red');
var_dump ($colors_love_Array);
的结果是:
array(1) { [0]=> string(59) "Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red " }
答案 0 :(得分:2)
作为 in_array 的文档状态:
in_array - 检查数组中是否存在值
但是var_dump清楚地告诉你,你想要的嵌套值是一个字符串。
array(1) { [0]=> string(59) trim("Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red ") }
^^^^^^
一种可能的方法是使用 strpos 而不是 in_array :
$Color='Black';
if (strpos($Color, $colors_love_Arrays[0]) !== false) {
echo "Matches: ", $Color;
但是,如果您有颜色,例如WeirdBlack
。
事实上:
$Color='Black';
if (strpos($Color, "WeirdBlack") !== false) {
echo "Matches: ", $Color;
<强>输出强>
Matches: WeirdBlack;
或者您想使用 preg_match :
$Color='Black';
if (preg_match('/(?:^|,)('.$Color.')(?:,|$)/', "Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red ") !== false)
echo "Matches: ", $Color;
使用的正则表达式是'/(?:^|,)('.$Color.')(?:,|$)/'
:
<强> DEMO 强>
您可能希望获得一个数组。然后使用explode:
$arr = explode(',', trim($colors_love_Array[0]));
然后像这样使用它:
$Color='Black';
if (in_array($Color, $arr)) {
echo "Matches: ", $Color;
}
或者再次使用 preg_match :
$Color = 'Black';
$arr = explode(',', trim("Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red "));
if (preg_grep('/('.$Color.')/', $arr))
echo 'match';
答案 1 :(得分:1)
检查一下,我认为它应该适合你
$ colors_love_Array = array();
$ result = mysql_query(“SELECT * FROM style WHERE style.user_id = $ user_id”)或die(mysql_error());while($ row_profile = mysql_fetch_array($ result)){
//我已经尝试过这两种方式,无论是分开还是在一起 $ colors_love_Array [] = $ row_profile ['colors_love'];
}$ newColorsArray = explode(“,”,implode($ colors_love_Array));
if(in_array($ Color,$ newColorsArray)){
echo“Matches:”。$ Color;
}
答案 2 :(得分:0)
你的结果不应该是一个数组,而不是用逗号分隔的字符串吗?
无论如何,你的结果是上面的var_dumped。
$parts = explode( ',', trim( $colors_love_Array ) );
if( in_array( 'Black', $parts ) )
echo "is here\n";
但我想你真的想得到这个:
"Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red"
作为一个数组。由于我不知道您的数据库中有什么,我无法在该领域提供建议。
答案 3 :(得分:0)
你的方法有点不对劲。代码将所有颜色存储为字符串,尽管您将它们作为数组接收。因此,您需要使用strpos
在字符串中搜索另一个字符串的特定匹配项 - 即字符串是否包含Black
。使用这种方法会使您的生活变得更加艰难,例如,如果您以后需要能够以特定方式对颜色进行排序。
正如@Adam Sinclair建议的那样,因为数据包含在string
中,您可以使用preg_match
来检查字符串是否包含颜色。不幸的是preg_match
是一个非常昂贵的功能,应该明智地使用,作为最后的手段。
另外,我建议您使用PDO
并准备好与数据库连接的语句 - 您不希望SQL注入,对吧?
在我看来,实现任务的更好方法是使用类似下面的代码:
<?php
// Host
$hostname = 'localhost';
// Database
$database = 'database';
// Username
$username = 'user';
// Password
$password = 'pass';
// Connection DSN.
// http://php.net/manual/en/ref.pdo-mysql.connection.php
$dsn = 'mysql:host='.$hostname.';dbname='.$database;
try {
// Create a database connection using PDO
$db = new PDO($dsn, $username, $password);
// The value of the user_id (i.e. $_SESSION['user_id'])
$user_id = 1301;
// Get all colors, liked by a specific user.
$query = $db->prepare('SELECT * FROM style WHERE style.user_id = :user_id');
// Bind the value of $user_id to :user_id in the query.
$query->bindValue(':user_id', $user_id);
// Execute the query
$query->execute();
// Gets all results for a specific database column (i.e. 'color_loves').
// In my table, I had color_id, user_id, color_loves, therefore the desired index is 2.
// NOTE: Remember array indexes start counting from 0.
$colors = $query->fetchAll(PDO::FETCH_COLUMN, 2);
// The output of the above will be something similar to this:
// array(5) { [0]=> string(5) "Black" [1]=> string(8) "Charcoal" [2]=> string(10) "Light_Gray" [3]=> string(5) "White" [4]=> string(10) "Royal_Blue" }
$color='Black';
if (in_array($color, $colors)) {
echo "Matches: ", $color;
}
// Outputs Matches: Black
// Disconnect from the database.
$db = null;
}
catch(PDOException $e)
{
// Output any exception messages that might occur
echo $e->getMessage();
}
?>
正如您所看到的 - 它简单,干净,安全且可扩展。不需要难以阅读的正则表达式,爆炸/爆炸字符串/数组等等。如果将来,您的任务发展并且颜色需要排序,您可以通过准备manual轻松实现这一点。