php - 在PHP作业方面需要帮助- friend 匹配算法

标签 php

我对php完全不熟悉,已经开始学习它了。我有两份php和html作业。
作业1:
我得储存一些人的名字和他们所有的朋友的名字。我只列出有共同朋友的人。我的问题是,如果一个人和其他人没有共同的朋友,我会收到一条信息“Rana和Roni有0个共同的朋友。我要我阻止:
作业2:
我有一个html表单从上一个php文件中搜索一个人
当我搜索rana时,php表单将打开并打印:
拉纳有四个朋友,他和南迪尼和马蒙有一个共同的朋友。
当我搜索Tanmoy时,页面将打开并打印:
Tanmoy是Rana的朋友,她和Nandini和Mamun有4个朋友和共同的朋友。
为此,我必须使用函数“post/get/request”
这是我目前的代码:

<?php
   # Function: finfCommon

function findCommon($current, $arr) {
    $cUser = $arr[$current];
    unset($arr[$current]);
    foreach ($arr As $user => $friends) {
        $common = array();
        $total = array();
        foreach ($friends As $friend) {
            if (in_array($friend, $cUser)) {
                $common[] = $friend;
            }
        }
        $total = count($common);
        $add = ($total != 1) ? 's' : '';
        $final[] = "<i>{$current} has {$total} friend{$add} in common with {$user}.</i>";
    }
    return implode('<br />', $final);
}

# Array of users and friends

$Friends = array(
    "Rana" => array("Pothik", "Zaman", "Tanmoy", "Ishita"),
    "Nandini" => array("Bonna", "Shakib", "Kamal", "Minhaj", "Ishita"),
    "Roni" => array("Akbar", "Anwar", "Khakan", "Pavel"),
    "Liton" => array("Mahadi", "Pavel"),
    "Mamun" => array("Meheli", "Tarek", "Zaman")
);

# Creating the output value

$output = "<ul>";
foreach ($Friends As $user => $friends) {
    $total = count($friends);
    $common = findCommon($user, $Friends);
    $output .= "<li><u>{$user} has {$total} friends.</u><br /><strong>Friends:</strong>";
    if (is_array($friends) && !empty($friends[0])) {
        $output .= "<ul>";
        foreach ($friends As $friend) {
            $output .= "<li>{$friend}</li>";
        }
        $output .= "</ul>";
    }
    $output .= "{$common}<br /><br /></li>";
}
$output .= "</ul>";

# Printing the output value
print $output;
?>

最佳答案

对于作业1.1:你只需要用一个

if ($total>0) { 
    $output .= "<li><u>{$user} has {$ ...
}

条款。
对于第二个任务:
您必须创建一个页面,该页面期望通过$get、$post或$request读取参数(例如,将其称为name)。它们不是函数,是数组,您可以从程序的每个范围访问它们(它们是超全局的,您不需要用gobals声明它们)。
如果缺少姓名(例如$_request['name']),我只会打印一个带有已知人员的select,只需打印表单,否则,会找到输入所指示的人员并打印搜索结果。
编辑:
对于第二个赋值,您将不得不考虑如何获取输入数据。
也许我会用一种不同的方法
如果你有类似的表格
<form action="homework.php" method="get">
   Person: <select name="searchperson" />
     <option> </option>
     ...
     <option> </option>
   </select>
</form>

你必须以类似的方式获得所有已知民族的名单:
$friends = array(
  "Rana" => array("Pothik", "Zaman", "Tanmoy", "Ishita"),
  "Nandini" => array("Bonna", "Shakib", "Kamal", "Minhaj", "Ishita"),
  "Roni" => array("Akbar", "Anwar", "Khakan", "Pavel"),
  "Liton" => array("Mahadi", "Pavel"),
  "Mamun" => array("Meheli", "Tarek", "Zaman")
);

// create a flat array with all the known peoples
$knownPeople = array_reduce(
  $friends, 
  function($current, $result) { 
    return array_merge($result, $current);
  }, 
  array_keys($friends)
);

$knownPeople = array_flip(array_flip($knownPeople)); //get rid of duplicates
asort(knownPeople);     // sort the names
$knownPeople = array_values($knownPeople); // normalize the array indexes

然后使用这样的函数获取所需的表单:
function theForm($people) {
  $options = '<option>'.join("</option>\n<option>",$people). '</option>';
  echo "
  <form action=\"homework.php\" method=\"get\">
  <h2>Chose the people you want investigate on:</h2>
  Person: <select name=\"person\" />
    $options
  </select>
  </form>"; 
}

无论您是否掌握了前面的代码,都必须评估输入并采取适当的操作:
假设您的脚本名为journess.php(您将在表单的操作中看到该名称),它位于adhttp://example.com中。他的uri将http://example.com/homework.php
有几种可能的情况:
用户第一次调用脚本
用户从选择中选择一个人
用户使用已知的人作为参数手动调用脚本
用户与列表中没有的人手动调用脚本
让我们回顾一下不同的案例:
用户第一次调用脚本
结果是:用户通过链接或将uri写入浏览器地址栏。
如何检测这种情况:根据上面的表单,您可以检查http://example.com/homework.php['person']。如果不是$_GETisset或不empty您可以声明进入第一个场景。
要做的:只需输出表单并退出。
用户从选择中选择一个人
结果是:用户得到表单(第一个场景)并从select中选择一个名称。
如何检测此场景:第一个场景的检测失败,您可以在knownpeople数组中找到包含在$_get['person']中的名称。
要做:
清除输入(删除任何虚假字符)
在knownpople数组中查找名称以确保您没有提供伪造的请求
将您的函数应用于输入中的人员,以便获得所需的输出
输出你得到的结果
新查询或array_key_exists链接的表单
用户使用已知的人作为参数手动调用脚本
结果是:用户使用类似http://example.com/homework.php的uri来访问脚本
如何检测这种情况:如果在表单中使用的方法是get,则不能(至少不能使用这个简单的场景),也不必费心,因为这可以被视为一个合法请求,因为这是一个家庭作业,而且您对它没有要求。如果使用方法post,则有机会检测到伪造,因为随该方法传递的参数通常存储在http://example.com/homework.php?person=Rana数组中。您仍然可以在knownpeople数组中找到包含在$_get['person']中的名称。
待办事项:与第二个场景相同
清除输入(删除任何虚假字符)
在knownpople数组中查找名称以确保您没有提供伪造的请求
将您的函数应用于输入中的人员,以便获得所需的输出
输出你得到的结果
新查询或$_POST链接的表单
用户与列表中没有的人手动调用脚本
如何检测此方案:第一个方案的检测失败,并且在knownpople数组中找不到$_get['person']中包含的名称。
要做:
清除输入(删除任何虚假字符)
在knownpople数组中查找名称以确保您没有提供伪造的请求
当检查失败时,会输出一条错误消息,指出用户是未知的,并让用户使用指向http://example.com/homework.php的链接转到正确的uri。
不是所有的赝品都是坏的。考虑一个进行合法搜索并为结果添加书签的用户。如果好友列表发生更改,然后他使用书签返回页面。他将直接陷入第四种情况
希望这将帮助您理解php脚本是如何工作的。

关于php - 在PHP作业方面需要帮助- friend 匹配算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706969/

相关文章:

php - 使用 Docker 和 Laravel 我在 MySQL 中遇到此错误 : “SQLSTATE[HY000] [2002] No such file or directory”

php - Helper 与 Model 交互可以吗?

php - Laravel 应用存储图片加载失败并重定向到 404

php - 在 Laravel 项目的数据库中插入和更新主视频的问题

php - 当使用 !(self::$_instance instanceof self) 为什么这不起作用

php - 如果不是从包含运行,则运行代码

php - php 中的 MySQL 更新不起作用

php - 如何从导出的 csv 文件中删除双引号

php - 将自定义 CSS 添加到 Wordpress 中的特定模板页面

PHP 与继承类的协方差 - 声明不兼容