【问题标题】:Search Partial Query Given Array in PHP在 PHP 中搜索给定数组的部分查询
【发布时间】:2014-04-29 05:50:09
【问题描述】:

我正在尝试编写一个 php 函数来显示给定部分 ID 查询的人。我目前的代码可以接受对 ID 的完全查询,但无法找到一种方法来操作我的代码以返回部分字符串的值。

代码

function display_person($id) {
    global $people;
    if(array_key_exists($id, $people)) {
        header('Content-type: application/json');
        echo json_encode($people[$id]);
    } else {
        header('HTTP/1.1 404 Not Found');
    }
}

数组

$people = array(
'jjones' => array(
    'firstName' => 'Jim', 
    'lastName' => 'Jones', 
    'age' => 20, 
    'major' => 'Computer Science', 
    'phone' => '212-460-9393', 
    'email' => 'jjones@miamioh.edu', 
    'state' => 'OH'
),
'asmith' => array(
    'firstName' => 'April', 
    'lastName' => 'Smith', 
    'age' => 19, 
    'major' => 'Mechanical Engineering', 
    'phone' => '913-939-3929', 
    'email' => 'asmith@miamioh.edu', 
    'state' => 'WY'
),
'pstemple' => array(
    'firstName' => 'Pat', 
    'lastName' => 'Stemple', 
    'age' => 21, 'major' => 
    'Theater Performance', 
    'phone' => '917-222-2232', 
    'email' => 'pstemple@miamioh.edu', 
    'state' => 'NY'
),
'jjones1' => array(
    'firstName' => 'Janet', 
    'lastName' => 'Jones', 
    'age' => 22, 
    'major' => 'Botany', 
    'phone' => '817-332-9392', 
    'email' => 'jjones1@miamioh.edu', 
    'state' => 'CA'
),
'llerner' => array(
    'firstName' => 'Leon', 
    'lastName' => 'Lerner', 
    'age' => 18, 
    'major' => 'Biology', 
    'phone' => '315-444-3494', 
    'email' => 'llerner@miamioh.edu', 
    'state' => 'OH'
),
'mmeyer' => array(
    'firstName' => 'Margret', 
    'lastName' => 'Meyer', 
    'age' => 24, 
    'major' => 'Interactive Media Studies', 
    'phone' => '219-333-0303', 
    'email' => 'mmeyer@miamioh.edu', 
    'state' => 'OH'
),
'achaudhry' => array(
    'firstName' => 'Anik', 
    'lastName' => 'Chaudhry', 
    'age' => 19, 
    'major' => 'Management Information Systems', 
    'phone' => '914-555-5555', 
    'email' => 'achaudhry@miamioh.edu', 
    'state' => 'NY'
),
'sdogg' => array(
    'firstName' => 'Snoop', 
    'lastName' => 'Dogg', 
    'age' => 42, 
    'major' => 'Botany', 
    'phone' => '414-333-2433', 
    'email' => 'sdogg@miamioh.edu', 
    'state' => 'CA'
),
'bclinton' => array(
    'firstName' => 'Bill', 
    'lastName' => 'Clinton', 
    'age' => 25, 
    'major' => 'Political Science', 
    'phone' => '933-440-3033', 
    'email' => 'bclinton@miamioh.edu', 
    'state' => 'AK'
)
);

【问题讨论】:

  • 您要搜索的 ID 是什么?
  • 不要使用全局,不好。
  • @AmalMurali 例如,如果我输入 JJONES 作为查询,它会回显返回 JJONES 的值。我希望它呼应 JJONES 和 JJONES1 的值

标签: php arrays json


【解决方案1】:

如果您只想提供 1 个输出,您可以将代码稍微修改为:

function display_person($query) {
global $people;

$foundid = false;
foreach ($people as $k => $v)
    if (stripos($k, $query) !== false)
    {
        $foundid = $k;
        break;
    }

if($foundid !== false) {
    header('Content-type: application/json');
    echo json_encode($people[$foundid]);
} else {
    header('HTTP/1.1 404 Not Found');
}
}

另一种方法是找到所有可能的变体(为此您需要临时数组)

function display_person($query) {
global $people;

$foundid = array();
foreach ($people as $k => $v)
    if (stripos($k, $query) !== false)
    {
        $foundid[$k] = $v;
    }

if(count($foundid) > 0) {
    header('Content-type: application/json');
    echo json_encode($foundid); // NOTE: you need to change your JS code to accept array instead of 1 person
} else {
    header('HTTP/1.1 404 Not Found');
}
}

另外,我建议你检查一下 $query 是否足够长,通常是 3+ 个符号

【讨论】:

    【解决方案2】:

    similar_text() 为例...

    解释:

    为匹配项之间的相似性设置一个百分比为 80,这些匹配的字符串将被添加到 $sim 数组中。然后你可以json_encode()终于了。

    代码...

    function display_person_new($id,$people) {
        $arr = array_keys($people);
        foreach($arr as $v)
        {
            similar_text($id,$v,$percent);
            if($percent>80)
            {
                $sim[$v]=$people[$v];
            }
        }
        if(!empty($sim))
        {
        header('Content-type: application/json');
        echo json_encode($sim,JSON_PRETTY_PRINT);
        } else { header('HTTP/1.1 404 Not Found'); }
    }
    
    display_person_new('jjone',$people);
    

    OUTPUT :

    {
        "jjones": {
            "firstName": "Jim",
            "lastName": "Jones",
            "age": 20,
            "major": "Computer Science",
            "phone": "212-460-9393",
            "email": "jjones@miamioh.edu",
            "state": "OH"
        },
        "jjones1": {
            "firstName": "Janet",
            "lastName": "Jones",
            "age": 22,
            "major": "Botany",
            "phone": "817-332-9392",
            "email": "jjones1@miamioh.edu",
            "state": "CA"
        }
    }
    

    【讨论】:

    • 可能需要注意您在输出中丢失了 ID
    • @Phil,谢谢。修复。 !
    • $v 不是一个数组,它是关键。$v 是来自array_keys() 的值之一
    • 我没有调用任何东西,只是通过执行$sim[$v] 将键分配给$sim 数组,当我这样做时,与此键$v 对应的数组将被推送到此$sim 数组$sim[$v] = $people[$v];
    • @CodeLover,你明白了;)
    【解决方案3】:

    首先,创建一个匹配键的数组。例如

    $matchingIds = array_filter(array_keys($people), function($pid) use ($id) {
        // perform a case insensitive search for $id in $pid
        return stripos($pid, $id) !== false;
    });
    

    然后,将此数组与您的 $people 键相交

    $matches = array_intersect_key($people, array_flip($matchingIds));
    // array_flip allows us to flip the matching ID values into keys
    // so we can intersect with the $people keys
    
    if (count($matches)) {
        header('Content-type: application/json');
        echo json_encode($matches);
    } else {
        http_response_code(404);
        echo 'No matches found';
    }
    

    最后,我将取消 global 变量。使用它们会使测试变得困难并增加对全局状态的依赖(这很糟糕)。相反,在调用时将$people 数组注入到函数中

    function display_person($id, array $people) {
        ...
    }
    

    【讨论】:

      【解决方案4】:
      function display_person($id)
      {
          global $people;
      
          foreach ($people as $key => $value)
          {
              if (strpos($key, $id) === 0)
              {
                  header('Content-type: application/json');
                  echo json_encode($people[$key]) . "<br>";
              } else
              {
                  header('HTTP/1.1 404 Not Found');
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        相关资源
        最近更新 更多