草庐IT

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

coder 2024-05-04 原文

我对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 - 在PHP作业方面需要帮助- friend 匹配算法的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  3. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  4. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  5. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  6. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  7. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  8. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  9. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  10. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

随机推荐