【问题标题】:Scanning lines in a .txt for specific values [duplicate]扫描 .txt 中的行以获取特定值 [重复]
【发布时间】:2012-11-11 17:08:11
【问题描述】:

可能重复:
how to extract data from csv file in php

我最近收到一项任务,要求我制作一个模拟约会网站。提供了很多工作,而我所需要的就是编写 PHP。我坚持的部分是关于在 .txt 文件(已输入的名称数据库)中查找查询名称和名称之间的“匹配”。文本文件如下所示:

Jenny,F,28,INTJ,Gentoo,18,30
Michael,M,22,ISTJ,Windows,20,25
...
Name,Gender,Age,Personality,OS,minage,maxage

我正在使用的页面提示我输入一个姓名(.txt 文件中的一个人的姓名),然后找到潜在的匹配项。 “匹配”是具有以下所有条件的任何人:相反的性别,在他们各自的年龄范围内,共享至少两个性格类型的字母(例如 ISTP + ESFP = 匹配),以及相同的最喜欢的操作系统。然后它以 HTML 格式显示匹配项,这是我能够做到的。

我的问题是我不完全确定如何交叉引用文本文件。我最初认为我应该将 .txt 的每一行放入更大数组的数组元素中:

<?php
    //Initialize the contents of the url (.php?name=$$$) into a variable $inputname
    $inputname = $_GET["name"];
    //Finds how many lines in the singles.txt file
    $lines = count(file("./singles.txt"));
    //Initialize each line into an array
    $matchespre = file("./singles.txt");
?>

...但我不确定如何搜索特定字符(INTJ、M、30、40 等)。

如何获得我想要的结果?如果很难理解我的最终目标是什么,我很抱歉,这个问题本身很难理解(在我看来)。显然我缺乏发布图片的声誉,否则我会截屏发布作业问题本身。

编辑;我想也许我正在寻找一种将 .txt 的每一行放入一个字符串的方法(例如 string1 = Jenny,F,28,INTJ,Gentoo,18,30; string2 = Michael,M,22, ISTJ、Windows、20、25 等),然后将每个字符串explode() 成一个数组,所以我有一堆数组。然后我可以按顺序搜索每个数组以查找匹配的性别、年龄范围等。我只是缺少 PHP 必须提供的函数百科全书,无法确切知道该怎么做。

【问题讨论】:

  • 你很聪明,可以胜任这项任务。您只是缺少文档;)...给您:php.net/manual

标签: php


【解决方案1】:

如果所有值的顺序相同,您可以愉快地将它们放入一个数组中并为适当的值排序,只需创建一个数组并循环遍历这些行...

// Jenny,F,28,INTJ,Gentoo,18,30

// make an array to put your values in
$array = array();

// loop through the lines
foreach($text as $line) {
  $values = $explode(",",$line);
  $array[]['name'] = $values[0];             // Jenny
  $array[]['gender'] = $values[1];           // F
  $array[]['age'] = $values[2];              // 28
  $array[]['whatever_that_is'] = $values[3]; // INTJ
  $array[]['operating_system'] = $values[4]; // Gentoo
  $array[]['min_age'] = $values[5];          // 18
  $array[]['max_age'] = $values[6];          // 30
}

抱歉,您可能需要寻找符合条件的人...!

// search for the gender in your array
// set the gender you are looking for
$gender = "M";
// make a new array
$nameArray = array();

// loop through your other array
foreach($array as $fieldArr) {
  if($fieldArr['gender'] = $gender;) {
    // echo or add that person to another array,
    //or whatever you want to do
    echo $fieldArr['name'] . "<br />\n";
  }
}

【讨论】:

  • 我建议将 'whatever_that_is' 拆分为一个单独的数组: $array[]['whatever_that_is'] = explode( $values[3], '');
  • 谢谢!请原谅我,但我不完全确定 foreach() 是如何工作的;有没有办法只使用for循环来做到这一点?我的理解是它们是相同的,取决于您使用的偏好;我更喜欢 for 而不是 foreach。
  • foreach() 只是一个懒惰的 for() ;) 它循环遍历数组中的所有项目,就好像你在做 $item[$i] 或其他什么。
  • 有道理。我首先学习了 C,而且执行更长的 for 循环似乎比 foreach() 更合乎逻辑,但这只是我。感谢您的帮助,我真的很感激!
【解决方案2】:

我会将每一行分成单个参数:

$arrDating = array();
foreach($matchespre as $line) {
    array_push($arrDating, explode(',', $line) );
}

【讨论】:

  • 值存储在哪里?恐怕我真的没有跟上。编辑;事实上,我想我有点明白了。它将它们存储到 arrDating[i][j];我在 C 语言中遇到过类似的多维数组。我想这是 PHP 的等价物?
  • 没错,值 arrDating[0][2] 将是第一行的第二个值:'28'
  • 太好了,谢谢!现在一切都很顺利。
  • 酷 :)... 我在上面的评论中发现了一个错误:arrDating[0][2] 当然是 第三个 值,而不是第二个。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多