【问题标题】:Check if array key matches data from select query检查数组键是否与选择查询中的数据匹配
【发布时间】:2015-08-11 15:59:48
【问题描述】:

我有一个多维数组。单独数组的键是文本。我想知道如何将键与来自循环 SELECT 数据的字符串的一部分进行匹配。

数组示例

Array ( [Volvo] => Array ( [0] => ) 
        [Ford] => Array ( [0] => ) 
        [Seat] => Array ( [0] => ) )

那么从这个数组$cars 中,我如何能够匹配来自我的SELECT 查询的数据

选择输出 echo $row['car'];

沃尔沃、奔驰、雷克萨斯

我在追求什么

如果我的一个数组的键与我的选择查询中的部分字符串匹配,那么正如上面的示例所说,沃尔沃会匹配,然后做一些事情。对我来说,这就是在该数组中添加更多数据。

我尝试了in_arrayarray_searcharray_filter 的变体,但没有找到适合我的解决方案。

我通过 foreach 循环所做的相反的示例

    $searchword = $array_element;
$result = array_filter($cars, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); });

取自:Search for PHP array element containing string

【问题讨论】:

  • 我已经尝试过的变体,只需向我们展示 1 次尝试,我们就会向您展示您遇到的问题以及如何解决您的问题。
  • @Rizier123 我发布了一个编辑。我不喜欢这个,因为它不适用于 MD 数组,并且出于速度原因我不想循环每个数组键。所有其他变体都与上述相同,无用。
  • 无用,尝试永远没有用!它可以帮助你学习东西。尝试一些东西,看看它的作用对学习很有帮助。

标签: php arrays multidimensional-array


【解决方案1】:

这应该适合你:

首先我使用preg_split() 将您的搜索字符串 (Volvo, Mercedes, Lexus) 拆分为一个数组。

正则表达式:

/\s*,\s*/

就是这个意思:

  • \s* 匹配任何空白字符 [\r\n\t\f ]
    • 量词:*在零次和无限次之间,尽可能多次,按需回馈[贪婪]
  • , 匹配字符,字面意思
  • \s* 匹配任何空白字符 [\r\n\t\f ]
    • 量词:*在零次和无限次之间,尽可能多次,按需回馈[贪婪]

这确保我们在您的字符串中的搜索词中没有空格。所以有了这个,我们最终会得到一个这样的数组:

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] => 
        )

)

【讨论】:

  • 你的明星!我只需要进行几次调整即可 100% 得到我需要的东西,非常感谢@Rizier123
【解决方案2】:

有很多方法可以实现您的目标。我会使用函数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])

【讨论】:

    【解决方案3】:

    尝试使用PHPstripos,简单有效:

    基础数据:

    $array = Array ( [Volvo] => Array ( [0] => ) 
            [Ford] => Array ( [0] => ) 
            [Seat] => Array ( [0] => ) )
    ;
    

    SQL 数据(字符串或数组):

    $row['car']; // string
    $row //array of all SQL columns output
    

    Foreachstripos

        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);
    

    这可能不是最有效的,但应该会给你想要的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多