1

我正在研究一个 php 函数,它将比较两个数组的组件。数组中的每个值只有一个英文单词长。没有空间。没有字符。

数组#1:英语中最常用单词的列表。$common_words_array

数组#2:一个用户生成的句子,转换为小写,去掉标点符号,并使用空格(“”)作为分隔符exploded()。$study_array

还有一个 $com_study 数组,在这种情况下用于跟踪常用单词的顺序,这些单词在 $study_array 中被“_”字符替换。

使用嵌套的 for 循环,脚本应该将数组 #2 中的每个值与数组 #1 中的每个值进行比较。当它找到一个匹配项(又名。一个常用的英语单词)时,它会做一些与当前问题无关的其他魔法。

截至目前,PHP 无法识别两个数组字符串值何时相等。我在这里将代码添加到有问题的函数中以供参考。我添加了许多不必要的回显命令,以便将问题本地化到 if 语句。

有人能看到我错过的东西吗?相同的算法在 Python 中完美运行。

function create_question($study_array, $com_study, $common_words_array)
{
for ($study=0; $study<count($study_array); $study++)
    {
    echo count($study_array)." total in study_array<br>";
    echo "study is ".$study."<br>";

    for ($common=0; $common<count($common_words_array); $common++)
        {
        echo count($common_words_array)." total in common_words_array<br>";
        echo "common is ".$common."<br>";

        echo "-----<br>";
        echo $study_array[$study]." is the study list word<br>";
        echo $common_words_array[$common]." is the common word<br>";
        echo "-----<br>";

          // The issue happens right here.
          if ($study_array[$study] == $common_words_array[$common])
            {
            array_push($com_study, $study_array[$study]);
            $study_array[$study] = "_";
            print_r($com_study);
            print_r($study_array);
            }
        }
    }

    $create_question_return_array = array();
    $create_question_return_array[0] = $study_array;
    $create_question_return_array[1] = $com_study;

    return $create_question_return_array;
}

编辑:在你们这些了不起的程序员的建议下,我更新了 if 语句,使其更加简单,便于调试。见下文。仍然存在未激活 if 语句的相同问题。

if (strcmp($study_array[$study],$common_words_array[$common])==0)
{
echo "match found";
//array_push($com_study, $study_array[$study]);
//$study_array[$study] = "_";
//print_r($com_study);
//print_r($study_array);
}

编辑:应 bansi 的要求,这是我调用该函数的主界面片段。

$testarray = array();

$string = "This is a string";
$testarray = create_study_string_array($string);

$testarray = create_question($testarray, $matching, $common_words_array);

至于结果,我只是得到一个空白屏幕。我希望简化的回显语句将“找到匹配”输出到屏幕,但这并没有发生。

4

5 回答 5

1

改变

array_push($com_study, $study_array[study]);

array_push($com_study, $study_array[$study]);
 // You missed a $                  ^ here

编辑:
以下代码输出 3 'match found'。我不知道 and 的值$common_words_array$matching所以我使用了一些任意值,而不是使用create_study_string_array我刚刚使用的函数 explode。仍然很困惑,无法弄清楚你到底想要达到什么目的。

<?php
$testarray = array ();

$string = "this is a string";
$testarray = explode ( ' ', $string );
$common_words_array = array (
        'is',
        'a',
        'this' 
);
$matching = array (
        'a',
        'and',
        'this' 
);

$testarray = create_question ( $testarray, $matching, $common_words_array );

function create_question($study_array, $com_study, $common_words_array) {
    echo count ( $study_array ) . " total in study_array<br>";
    echo count ( $common_words_array ) . " total in common_words_array<br>";
    for($study = 0; $study < count ( $study_array ); $study ++) {
        // echo "study is " . $study . "<br>";

        for($common = 0; $common < count ( $common_words_array ); $common ++) {
            // The issue happens right here.
            if (strcmp ( $study_array [$study], $common_words_array [$common] ) == 0) {
                echo "match found";
            }
        }
    }

    $create_question_return_array = array ();
    $create_question_return_array [0] = $study_array;
    $create_question_return_array [1] = $com_study;

    return $create_question_return_array;
}

?>

输出:

4 total in study_array
3 total in common_words_array
match foundmatch foundmatch found
于 2013-09-09T04:44:11.990 回答
1

在移动设备上,似乎无法复制文本。在 push 命令中访问研究数组时,您忘记了美元符号。

于 2013-09-09T04:44:14.350 回答
1

(编辑)确保您的拆分功能删除了多余的空格(例如preg_split("\\s+", $input)),并且输入被正确规范化(小写字母,特殊字符被去除等)。

于 2013-09-09T04:51:45.800 回答
0

使用 === 而不是 ==

if ($study_array[$study] === $common_words_array[$common])

或者甚至更好地使用strcmp

 if (strcmp($study_array[$study],$common_words_array[$common])==0)
于 2013-09-09T04:47:57.880 回答
0

尽可能使用内置函数以避免不必要的代码和拼写错误。此外,提供样本输入也会有所帮助。

$study_array = array("a", "cat", "sat", "on","the","mat");
$common_words_array = array('the','a');
$matching_words = array();

foreach($study_array as $study_word_index=>$study_word){

    if(in_array($study_word, $common_words_array)){

        $matching_words[] = $study_word;

        $study_array[$study_word_index] = "_";

        //do something with matching words
    }

}

print_r($study_array);

print_r($matching_words);
于 2013-09-09T04:54:04.230 回答