如何使用JSON字典在PHP中创建简单的NLP wordmap?

如何使用JSON字典在PHP中创建简单的NLP wordmap?,php,json,Php,Json,我在试着做一个文字地图 这是我的字典: { "hey": "hello", "heya": "hello", "heyo": "hello", "hiya": "hello" } 我想用PHP把所有这些单词都变成hello 我尝试了foreach和for循环来输出hello 但是,输出当前为空 : 我如何解决这个问题 In_数组查找值,而不是键。 您应该在数组的array_键上执行in_array操作,或者只回显$array[$word] $arr = json_decode(

我在试着做一个文字地图

这是我的字典:

{
  "hey": "hello",
  "heya": "hello",
  "heyo": "hello",
  "hiya": "hello"
}
我想用PHP把所有这些单词都变成hello

我尝试了foreach和for循环来输出hello

但是,输出当前为空

:


我如何解决这个问题

In_数组查找值,而不是键。 您应该在数组的array_键上执行in_array操作,或者只回显$array[$word]

$arr = json_decode($json, true);

$word = "Heya";

echo $arr[strtolower($word)]; //hello
当然,一个好方法是在echo之前添加ifisset$arr[strtolower$word]

由于使用in_数组的方式,代码只会检查单词是否为空,因此它不会在in_数组中找到匹配项并结束。
第二个if中的代码从不运行。

在数组中查找值,而不是键。 您应该在数组的array_键上执行in_array操作,或者只回显$array[$word]

$arr = json_decode($json, true);

$word = "Heya";

echo $arr[strtolower($word)]; //hello
当然,一个好方法是在echo之前添加ifisset$arr[strtolower$word]

由于使用in_数组的方式,代码只会检查单词是否为空,因此它不会在in_数组中找到匹配项并结束。
第二个if中的代码从不运行。

使用in\u数组搜索值。实际上,您需要检查数组中是否存在该键,如果存在,则该值将是相应的转换

<?php
$word = $_GET['word'] ?? null;
//$word = 'hey'; // Used here for testing bypassing query params.
if (is_null($word)) {
    echo "Error: No word defined.";
    return;
}

$json=<<<JSON
{
  "hey": "hello",
  "heya": "hello",
  "heyo": "hello",
  "hiya": "hello"
}
JSON;
$translation_table = json_decode($json, true);

$translation = array_key_exists($word, $translation_table)
    ? $translation_table[$word]
    : null;

如果找不到该单词,则翻译将被指定为空。

使用in_数组搜索值。实际上,您需要检查数组中是否存在该键,如果存在,则该值将是相应的转换

<?php
$word = $_GET['word'] ?? null;
//$word = 'hey'; // Used here for testing bypassing query params.
if (is_null($word)) {
    echo "Error: No word defined.";
    return;
}

$json=<<<JSON
{
  "hey": "hello",
  "heya": "hello",
  "heyo": "hello",
  "hiya": "hello"
}
JSON;
$translation_table = json_decode($json, true);

$translation = array_key_exists($word, $translation_table)
    ? $translation_table[$word]
    : null;
<?php 

$wordList = json_decode($json, true);
$translateKeys = array_keys($wordList);

$search = 'Hello';

foreach ($translateKeys as $wordKey) {

    $lastLetter = substr($wordKey, -1);

    // Considering cases of heyaaaaaaaaaa instead of heya
    if(preg_match('/^'.$wordKey. $lastLetter .'*?/i', $search)){

        $transtateFoundKey = $wordKey;
    }
}

echo $wordList[$transtateFoundKey] ?? 'No match found';

如果找不到该单词,翻译将被分配为空。

您的代码包含多个错误

<?php 

$wordList = json_decode($json, true);
$translateKeys = array_keys($wordList);

$search = 'Hello';

foreach ($translateKeys as $wordKey) {

    $lastLetter = substr($wordKey, -1);

    // Considering cases of heyaaaaaaaaaa instead of heya
    if(preg_match('/^'.$wordKey. $lastLetter .'*?/i', $search)){

        $transtateFoundKey = $wordKey;
    }
}

echo $wordList[$transtateFoundKey] ?? 'No match found';
if (in_array(word, $jsondata)) {
这里可能有一个打字错误。这一行应改为:

if (in_array($word, $jsondata)) {
但是为什么口译员不报告错误呢

它报告它,但它将其作为通知报告,并且默认情况下,解释器配置为不显示通知

word不是PHP变量,也不是PHP关键字。老实说,这没什么;只是一个四个字母的单词,在代码中没有任何意义。 但是解释器很宽容,认为你想写字符串,但是你忘记了引号。它会触发由于您的配置而不显示的通知,并将字转换为字,然后继续执行代码。 当然,从JSON解码的数组中不存在字符串,for循环也没有任何效果

一个更糟糕的错误是使用for循环来迭代一个没有数字键索引的数组

您的数组实际上是一个散列,也称为映射或字典;它将字符串与其他字符串相关联$jsondata[1]没有任何意义,除非$jsondata包含键1或键1,并且不会发生这种情况

您应该使用循环$jsondata,但不需要;如果您知道关联数组的键或反之亦然,那么还有其他更好的方法可以从该数组中获取值

另一个:

  if ($jsondata[i] == $word) {
    echo $newWord . $jsondata[i];
  }
如果$word的值与其他值相等,则上面的代码将打印该值。这意味着您的for循环会根据某些条件打印$word的值零次或多次。这种行为没有多大意义,也与你的描述不符

如果您只想将hey转换为hello、heya转换为hello等等,即$jsondata的键转换为其值,那么您需要的所有代码是:

// ...
$jsondata = json_decode($json, true);

echo($jsondata[$word]);
如果$word的值是$jsondata的键,那么$jsondata[$word]是它的关联值。否则为空并触发通知。 如果您希望编写干净的代码,即不触发任何通知或警告,则仅当$word是$jsondata的现有键时,才可以使用该值:


顺便说一句,返回的值不是一个JSON,而是一个字符串,而是一个对象或数组。在您的例子中,它是一个数组,因为您将TRUE作为JSON_decode的第二个参数传递。这意味着变量$jsondata的名称具有误导性,因为它不是JSON,并且与JSON没有任何关系。

您的代码包含几个错误

if (in_array(word, $jsondata)) {
这里可能有一个打字错误。这一行应改为:

if (in_array($word, $jsondata)) {
但是为什么口译员不报告错误呢

它报告它,但它将其作为通知报告,并且默认情况下,解释器配置为不显示通知

word不是PHP变量,也不是PHP关键字。老实说,这没什么;只是一个四个字母的单词,在代码中没有任何意义。 但是解释器很宽容,认为你想写字符串,但是你忘记了引号。它会触发由于您的配置而不显示的通知,并将字转换为字,然后继续执行代码。 当然,从JSON解码的数组中不存在字符串,for循环也没有任何效果

一个更糟糕的错误是使用for循环来迭代一个没有数字键索引的数组

你的阵列在 事实,也就是地图或字典;它将字符串与其他字符串相关联$jsondata[1]没有任何意义,除非$jsondata包含键1或键1,并且不会发生这种情况

您应该使用循环$jsondata,但不需要;如果您知道关联数组的键或反之亦然,那么还有其他更好的方法可以从该数组中获取值

另一个:

  if ($jsondata[i] == $word) {
    echo $newWord . $jsondata[i];
  }
如果$word的值与其他值相等,则上面的代码将打印该值。这意味着您的for循环会根据某些条件打印$word的值零次或多次。这种行为没有多大意义,也与你的描述不符

如果您只想将hey转换为hello、heya转换为hello等等,即$jsondata的键转换为其值,那么您需要的所有代码是:

// ...
$jsondata = json_decode($json, true);

echo($jsondata[$word]);
如果$word的值是$jsondata的键,那么$jsondata[$word]是它的关联值。否则为空并触发通知。 如果您希望编写干净的代码,即不触发任何通知或警告,则仅当$word是$jsondata的现有键时,才可以使用该值:



顺便说一句,返回的值不是一个JSON,而是一个字符串,而是一个对象或数组。在您的例子中,它是一个数组,因为您将TRUE作为JSON_decode的第二个参数传递。这意味着变量$jsondata的名称具有误导性,因为它不是JSON,也与JSON没有任何关系。

我认为问题出在这段代码中。如果在数组中,$jsondata,请尝试将其更改为如果在数组中$word,$jsondata,同时检查所有其他变量,因为有几个变量缺少美元符号前缀。请确保您有错误报告;启用后,它将对这些事情发出警告。您不能使用这样的for循环来迭代关联数组。另外,对于索引数组,索引从0开始,而不是1。我认为问题在于这段代码。如果在数组中,$jsondata,请尝试将其更改为如果在数组中$word,$jsondata,同时检查所有其他变量,因为有几个变量缺少美元符号前缀。请确保您有错误报告;启用后,它将对这些事情发出警告。您不能使用这样的for循环来迭代关联数组。另外,对于索引数组,索引从0开始,而不是从1开始。@Emma not true。我曾经错过一次。那是我说我错了的时候。你可以把它改成echo$arr[strtolower$word]??$word;这将满足找不到的项目。@NigelRen如果这是如果找不到的话应该发生的事情,那么是的。不过我不确定。@Emma不是真的。我曾经错过一次。那是我说我错了的时候。你可以把它改成echo$arr[strtolower$word]??$word;这将满足找不到的项目。@NigelRen如果这是如果找不到的话应该发生的事情,那么是的。不过我不确定。把JSON放在源代码中有什么意义?如果事先知道它的内容,那么就不需要JSON。json_decode生成的数组可以直接用于代码中。除了显示预期数据的格式并作为一个多功能示例运行之外,没有其他意义。问题中发布的json是正确的,解析它的代码也是正确的。好吧,我认为代码是一个遗憾的示例。我刚刚内联了JSON。这简直令人毛骨悚然。在源代码中加入JSON有什么意义?如果事先知道它的内容,那么就不需要JSON。json_decode生成的数组可以直接用于代码中。除了显示预期数据的格式并作为一个多功能示例运行之外,没有其他意义。问题中发布的json是正确的,解析它的代码也是正确的。好吧,我认为代码是一个遗憾的示例。我刚刚内联了JSON。这是头发分裂。谢谢@axiac!它工作得很好!是的,if语句是一个拼写错误。我习惯于JavaScript数组,所以。。。顺便说一句,我是PHP新手。谢谢@axiac!它工作得很好!是的,if语句是一个拼写错误。我习惯于JavaScript数组,所以。。。顺便说一句,我是PHP新手。