【问题标题】:PHP array search and fgetcsv [closed]PHP数组搜索和fgetcsv [关闭]
【发布时间】:2012-12-20 14:42:28
【问题描述】:

在这里坐了几个小时,但我看不出问题出在哪里。

我有 1 个文件: Gross_matching.csv:

Actionspiele,77
Strategiespiele,112

关键字是“Actionspiele, Strategiespiele”。

想得到这个文件,在“Actionspiele”之后搜索,想得到“77|112”。但我得到“77|77”。有人知道为什么吗?

<?php
if (!empty($articleData['keywords'])) {
    $temp_dir = "...";
    if (file_exists($temp_dir."gross_matching.csv")) {
        $csv = array();
        $file_gross = fopen($temp_dir."gross_matching.csv", 'r');
        while (($result = fgetcsv($file_gross, ",")) !== false) {
            $csv[] = $result;
        }
        fclose($file);
    } else {
        $articleData['attr_attr18'] .= " | File not found";
    }
    if (!empty($csv)) {
        $string = '';
        $keywords = explode(",", $articleData['keywords']);
        if(is_array($keywords)) {
            foreach($keywords as $key => $value) {
                $pos = array_search($value, $csv);
                $string .= $csv[$pos][1]."|";
            } 
            if (!empty($string)) {
                $articleData['attr_attr18'] = $string;
            } else {
                $articleData['attr_attr18'] .= " - String empty";
            } 
        }
    } else {
        $articleData['attr_attr18'] .= " - csv empty";
    }
} else {
    $articleData['attr_attr18'] .= " - not Gross";
}
?>

【问题讨论】:

  • 还将搜索放入它自己的功能中。所有这些 if 和 else 以及 what not 和 temp 的树,那里的关键字只是阻碍。
  • 添加更多 CSV 数据而不是仅添加两个搜索信息会很好,因为仍然需要考虑很多事情,例如重复的关键字等。您还应该为数据添加预期输出跨度>

标签: php arrays search matching fgetcsv


【解决方案1】:

您尝试使用array_search() 在数组$csv 中查找字符串"Actionspiele",但该数组的所有值本身都是数组,而不是字符串,因此搜索失败并返回false。当您使用false 作为数组索引时,它被强制转换为 0,因此它始终为您提供数组的第一行。

我会重写你的数组构建代码,看起来像这样:

$csv = array();
while ( $result = fgetcsv( $file_gross, "," ) ) {
    $csv[ $result[0] ] = $result[1];
}

这将使用 CSV 文件的第一列作为键,第二列作为 $csv 数组的值,所以它看起来像这样:

$csv = array(
    'Actionspiele' => 77,
    'Strategiespiele' => 112,
);

那么你就可以直接在数组中查找关键字了,像这样:

$ids = array();
foreach ( $keywords as $keyword ) {
    $ids[] = $csv[ $keyword ];
}
$string = implode( '|', $ids );

【讨论】:

  • 附言。我期待有一些内置的数组函数可以替换上一个示例中的foreach 循环,但我看了看并找不到,这让我有点惊讶。例如,在 Perl 中,可以使用数组(嗯,哈希)切片轻松做到这一点,但 PHP 的 array_slice() 似乎没有那么通用。我想$ids = array_intersect_key( $csv, array_flip( $keywords ) ); 会这样做,但似乎有点尴尬。
  • 为什么说它别扭?
  • @Baba:嗯,它使用了两个相对晦涩的功能(如果您在结果中坚持使用数字键,则为三个),这应该是一个简单而常见的操作。即使这样,它也不会尊重关键字的顺序,也不会允许关键字重复。 (当然,在这种特殊情况下,这些都不一定是问题。)在我看来,应该有更好的方法。
  • 有效点 .. 我现在能想到的唯一可以给出相同结果的函数是 array_reduce 但你需要一个 closure 那么为什么不首先使用 foreach 创建一个函数。 ..哪个更快........ +不错的答案
  • 谢谢,我会调查一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多