查找数组项PHP

时间:2014-01-09 17:00:02

标签: php arrays output

我已经失去了代码,并且不知道如何获得我需要以所需格式输出值的结果。

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

要明确这将返回所有拥有CCENT证书或MCSE

的用户

我的老板现在想通过使用操作符(+)将其更改为AND,这样当用户输入“CCENT + MCSE”时,查询应该返回拥有CCENT和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_where就是这个      sl.skill_name LIKE'%“。$ search [$ i]。”%'OR

我删除了最后一个OR

1 个答案:

答案 0 :(得分:0)

您可以过滤数组(假设它是名称$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");