【问题标题】:Finding array items PHP查找数组项 PHP
【发布时间】:2014-01-09 17:00:02
【问题描述】:

我的代码盲了,不知道如何获得需要以所需格式输出值的结果。

我在一个内部网站上有一个搜索功能,它根据多个字符串查询 MSSQL。例如,如果用户输入“CCENT MCSE”,查询将返回所有具有任一认证的用户。

需要明确的是,这将返回所有拥有 CCENT 证书或 MCSE 的用户

我的老板现在想通过使用运算符 (+) 号将其更改为 AND,因此当用户输入“CCENT+MCSE”时,查询应该返回具有 CCENT AND MCSE 认证的用户。

我构建查询的方式是将搜索字符串分解为一个数组,该数组引用 + 号作为分隔符。

我的 SQL 语句拉回以下结果

Array
(
[0] => Array
    (
        [username] => mshort
        [fname] => Matthew
        [lname] => Short
        [location_name] => CENTRAL REMOTE
        [grade_name] => E6
        [skill_name] => CCENT
    )

[1] => Array
    (
        [username] => mark.parry
        [fname] => Mark
        [lname] => Parry
        [location_name] => CENTRAL OFFICE
        [grade_name] => E4
        [skill_name] => MCSE Messaging
    )

[2] => Array
    (
        [username] => mark.parry
        [fname] => Mark
        [lname] => Parry
        [location_name] => CENTRAL OFFICE
        [grade_name] => E4
        [skill_name] => CCENT
    )

)

在这种情况下,我需要只显示同时拥有 CCENT 和 MCSE 的唯一用户,并丢弃只有其中一个的用户。

在上面的例子中,我只需要输出 Mark Parry 并丢弃 Matthew Short

我不知道该怎么做。请问你能帮忙吗?

谢谢

SQL 语句

SELECT username,fname,lname,el.location_name, eg.grade_name,el.location_name
,sl.skill_nameFROM engineer e 
INNER JOIN engineer_skills es ON e.id=es.engineer_id INNER JOIN skills_list sl ON    es.skill_id=sl.id 
INNER JOIN engineer_grades eg ON e.grade=eg.id 
INNER JOIN    engineer_location el ON e.location=el.id INNER JOIN team t ON e.team=t.id
WHERE e.id > 0 AND '.$sql_where.' ORDER BY lname' 

$sql_这是在哪里 sl.skill_name LIKE '%".$search[$i]."%' OR

然后我去掉最后一个 OR

【问题讨论】:

  • 查询是什么样的?
  • 为什么不在值周围使用引号?
  • 显示表结构和生成的 SQL 会很有帮助
  • 而不是尝试使用结果,只需将查询更改为AND
  • 我的 SQL 语句是这个'SELECT username,fname,lname,el.location_name, eg.grade_name,el.location_name,sl.skill_name FROM Engineer e INNER JOIN Engineer_skills es ON e.id=es。 Engineer_id INNER JOIN Skills_list sl ON es.skill_id=sl.id INNER JOIN Engineer_grades 例如 ON e.grade=eg.id INNER JOIN Engineer_location el ON e.location=el.id INNER JOIN team t ON e.team=t.id WHERE e.id > 0 AND '.$sql_where.' ORDER BY lname' $sql_where is this sl.skill_name LIKE '%".$search[$i]."%' OR and I strip the last OR

标签: php arrays output


【解决方案1】:

您可以过滤数组(假设它是名称$data

首先,通过用户名模拟组

$result = array();
foreach($data as $item) {
  if(!isset($result[$item["username"]])) $result[$item["username"]] = $item;
  else $result[$item["username"]]["skill_name"].="+".$item["skill_name"];
}

二、过滤结果

$filter = array("CCENT","MCSE");
function skill_and_filter($item) {
  global $filter;
  foreach($filter as $f) if(strpos($item["skill_name"],$f)===false) return false;
  return true;
}

$result = array_filter($result,"skill_and_filter");

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多