【问题标题】:In_array not working - compare two filesIn_array 不工作 - 比较两个文件
【发布时间】:2017-02-02 04:13:52
【问题描述】:

下面的代码是我正在尝试做的一个简单版本。该代码将读取两个文件,查看是否有匹配的条目,如果有,则显示该项目的数字差异。但它不起作用。第一个回显显示单词,但第二个回显从未到达。有人可以解释一下我缺少什么吗?

    $mainArry = array('Albert,8');
    $arry =     array('Albert,12');

    foreach ($arry as $line) {
        $kword = explode(',', $line); 
        echo 'kword '.$kword[0];
        if (in_array($kword[0], $mainArry)) {
            echo 'line '.$line. ' has count of '.$kword[1] . '<br>';
        }
    } 

【问题讨论】:

  • 你的第一个数组只包含一个元素,Albert,8。这是打算还是您希望将 2 个项目存储为 ["Albert", 8]
  • 您在 $mainArray 中搜索 'Albert' 的 kword,但 $mainArray 只有 'Albert,8',因此无法匹配。
  • stackoverflow 上的答案的好处之一是它们可以帮助其他用户解决类似的问题。由于您的问题确实很做作,因此在这方面收效甚微。对你来说,你想要实现的目标以及你为什么选择以特定的方式来做这件事,对你来说会更好。这不仅有助于提高答案的质量,还可以提高您的问题更好地为社区服务的可能性。写下你的问题时,一定要考虑到其他提问者。

标签: php


【解决方案1】:

您的 $mainArry 包含一个元素:字符串 'Albert,8'。看起来您想将其用作数组(元素 'Albert''8')而不是字符串。

您提到代码将从两个文件中读取,因此您可以像使用 $arry 一样将其“分解”为一个真正的数组。更简单的方法是使用 str_getcsv() 将 CSV 字符串解析为 $mainArry。

$inputString = 'Albert,8';
$mainArry = str_getcsv($inputString); // now $mainArry is ['Albert','8']
$arry =     array('Albert,12');

foreach ($arry as $line) {
    $kword = explode(',', $line); 
    echo 'kword '.$kword[0];
    if (in_array($kword[0], $mainArry)) {
        echo 'line '.$line. ' has count of '.$kword[1] . '<br>';
    }
} 

测试它here

【讨论】:

    【解决方案2】:

    您正在尝试将字符串 AlbertAlbert,8 进行比较,因此它们将不匹配。如果你想检查字符串是否包含关键字,假设你的数组有多个元素,你可以使用:

    $mainArry = array('Albert,8');
    $arry =     array('Albert,12');
    
    foreach ($arry as $line) {
        $kword = explode(',', $line); 
        echo 'kword '.$kword[0];
        foreach ($mainArry as $comp) {
            if (strstr($comp, $kword[0])) {
                echo 'line '.$line. ' has count of '.$kword[1] . '<br>';
            }
        }
    }
    

    示例:https://eval.in/728566

    【讨论】:

      【解决方案3】:

      我不推荐你的工作方式,但这是一个解决方案,基本上你应用于$arry 的过程也应该应用于你试图与之比较的$mainArry

       $mainArry = array('Albert,8');
          $arry =     array('Albert,12');
      
      /***
      NEW function below takes the valus out of the main array.
          and sets them in their own array so they can be properly compared. 
      ***/
       foreach ($mainArry as $arrr){
       $ma = explode(",",$arrr);
       $names[] = $ma[0];
       $values[] = $ma[1];
       }
       unset($arrr,$ma);
      
      
          foreach ($arry as $line) {
              $kword = explode(',', $line); 
              echo 'kword '.$kword[0];
              /// note var reference here is updated. 
              if (in_array($kword[0], $names)) {
                  echo '<br>line '.$kword[0]. ' has count of '.$kword[1] . '<br>';
              }
          }
      

      是的,MarcM's answer above 在简洁的一行中做了同样的事情,但我想进一步说明值设置的幕后操作。 :-/

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多