2013-01-06 144 views
1

在这里坐了几个小时,但我看不出什么问题。PHP阵列搜索和fgetcsv

我有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"; 
} 
?> 
+0

也将搜索放入它自己的函数中。所有这些if和else的树以及什么都不是和temp在这里,关键词那里只有阻碍。 – hakre

+0

如果您添加更多的CSV数据,而不仅仅是两个搜索信息,那将会很不错,因为还有很多事情仍然需要考虑,如重复的关键字等,您还应该为您的数据添加预期输出 – Baba

回答

4

您尝试使用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); 
+0

Ps。我期待有一个内置的数组函数可以替代上一个示例中的foreach循环,但是我查找并找不到一个,这让我感到惊讶。例如,在Perl中,可以使用数组(well,hash)slice轻松完成这项工作,但PHP的'array_slice()'看起来并不多。我想'$ ids = array_intersect_key($ csv,array_flip($ keywords));'会做到这一点,但它似乎有点尴尬。 –

+0

你为什么说它的尴尬? – Baba

+0

@Baba:嗯,它使用了两个相对比较模糊的函数(三个如果你坚持结果中的数字键),应该是一个简单而常见的操作。即使那样,它也不会尊重关键字的顺序,也不会允许关键字被复制。 (当然,在这个特殊情况下,这些都不一定是问题。)在我看来,应该有更好的方法。 –