在PHP中搜索给定数组的部分查询

在PHP中搜索给定数组的部分查询,php,arrays,json,Php,Arrays,Json,我正在尝试编写一个php函数,用于显示给定ID的部分查询的人。目前,我的代码可以接受ID的完全查询,但无法找到操作代码以返回部分字符串值的方法 代码 function display_person($id) { global $people; if(array_key_exists($id, $people)) { header('Content-type: application/json'); echo json_encode($people[

我正在尝试编写一个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'
)
);

如果只想提供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');
}
}
另一种方法是找到所有可能的变体(为此,您需要临时数组)


另外,我建议您检查$query是否足够长,通常是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) {
    ...
}
用你的例子。。。 说明: 为匹配项之间的相似性设置80,这些匹配的字符串将添加到
$sim
数组中。然后您可以
json\u encode()

代码。。。
输出:

{
    "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"
    }
}
功能显示\u人员($id)
{
全球500万人;
foreach($key=>$value的人)
{
if(strpos($key,$id)==0)
{
标题('Content-type:application/json');
echo json_encode($people[$key])。“
”; }否则 { 标头(“未找到HTTP/1.1 404”); } } }
您试图搜索的ID是什么?不要使用全局,这是错误的。@例如,如果我键入JJONES作为查询,它将返回JJONES的值。我想让它回显JJONES和jjones1的值。我想指出的是,您的output@Phil谢谢修好了
$v
不是数组,它是键。。
$v
数组_keys()
中的一个值,我没有调用任何东西,只是通过执行
$sim[$v]
将密钥分配给
$sim
数组,当我执行
$sim[$v]=$people[$v]时,与此密钥对应的数组将被推送到这个
$sim
数组中@CodeLover,你明白了;)
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);
{
    "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"
    }
}
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');
        }
    }
}