Php 如何以最少的时间浪费从Laravel框架中的数据库中获取一个普通数组中的所有单词?

Php 如何以最少的时间浪费从Laravel框架中的数据库中获取一个普通数组中的所有单词?,php,laravel,laravel-5.5,Php,Laravel,Laravel 5.5,我想将数据库中的所有单词放入默认数组中。我的数据库里有五万多个单词,很可能这个数字高达一百万。所以,我希望这次手术没有花太多时间。我试过这样的方法,在通常的数组中一个字也不放。也就是说,单词将传递到关联数组: $words = DB::table('words')->pluck('word'); dump($words); 结果: Collection {#197 ▼ #items: array:12 [▼ 0 => "тоҷик" 1 => "ӯзбек

我想将数据库中的所有单词放入默认数组中。我的数据库里有五万多个单词,很可能这个数字高达一百万。所以,我希望这次手术没有花太多时间。我试过这样的方法,在通常的数组中一个字也不放。也就是说,单词将传递到关联数组:

$words = DB::table('words')->pluck('word');
dump($words);
结果:

Collection {#197 ▼
  #items: array:12 [▼
    0 => "тоҷик"
    1 => "ӯзбек"
    2 => "қирғиз"
    3 => "эрон"
    4 => "япон"
    5 => "англис"
    6 => "тоҷик"
    7 => "ӯзбек"
    8 => "қирғиз"
    9 => "эрон"
    10 => "япон"
    11 => "англис"
  ]
}
array:12 [▼
  0 => {#210 ▼
    +"word": "тоҷик"
  }
  1 => {#207 ▼
    +"word": "ӯзбек"
  }
  2 => {#209 ▼
    +"word": "қирғиз"
  }
  3 => {#206 ▼
    +"word": "эрон"
  }
  4 => {#208 ▼
    +"word": "япон"
  }
  5 => {#205 ▼
    +"word": "англис"
  }
  6 => {#204 ▼
    +"word": "тоҷик"
  }
  7 => {#203 ▼
    +"word": "ӯзбек"
  }
  8 => {#202 ▼
    +"word": "қирғиз"
  }
  9 => {#200 ▼
    +"word": "эрон"
  }
  10 => {#213 ▼
    +"word": "япон"
  }
  11 => {#214 ▼
    +"word": "англис"
  }
]
第二种方法:

$words = DB::select("SELECT `word` FROM `words`");
dump($words);
结果:

Collection {#197 ▼
  #items: array:12 [▼
    0 => "тоҷик"
    1 => "ӯзбек"
    2 => "қирғиз"
    3 => "эрон"
    4 => "япон"
    5 => "англис"
    6 => "тоҷик"
    7 => "ӯзбек"
    8 => "қирғиз"
    9 => "эрон"
    10 => "япон"
    11 => "англис"
  ]
}
array:12 [▼
  0 => {#210 ▼
    +"word": "тоҷик"
  }
  1 => {#207 ▼
    +"word": "ӯзбек"
  }
  2 => {#209 ▼
    +"word": "қирғиз"
  }
  3 => {#206 ▼
    +"word": "эрон"
  }
  4 => {#208 ▼
    +"word": "япон"
  }
  5 => {#205 ▼
    +"word": "англис"
  }
  6 => {#204 ▼
    +"word": "тоҷик"
  }
  7 => {#203 ▼
    +"word": "ӯзбек"
  }
  8 => {#202 ▼
    +"word": "қирғиз"
  }
  9 => {#200 ▼
    +"word": "эрон"
  }
  10 => {#213 ▼
    +"word": "япон"
  }
  11 => {#214 ▼
    +"word": "англис"
  }
]
我想把这个表格中的所有单词都放在通常的数组中:

array:12 [▼
  0 => "тоҷик"
  1 => "ӯзбек"
  2 => "қирғиз"
  3 => "эрон"
  4 => "япон"
  5 => "англис"
  6 => "тоҷик"
  7 => "ӯзбек"
  8 => "қирғиз"
  9 => "эрон"
  10 => "япон"
  11 => "англис"
]
我需要这个来获得两个数组之间的差异。输入数组是一个乐观的数组,所以我需要从低音中提取所有的单词来添加到丰富的数组中。一般来说,在Laravel框架本身中是否有类似于
array_diff()
的函数

$diff = array_diff($input_array, $words_from_db);
并将差异添加到数据库中:

foreach ($diff as $value) {
    DB::table('words')->insert(['word'=>$value]);
}
我向数据库添加大量单词(数据)的方法是否正确?如果可能的话,我需要优化吗

总的来说,我从Laravel找到了这个函数:

public function diff($items)
{
    return new static(array_diff($this->items, $this->getArrayableItems($items)));
}
但是我如何将它用于get diff 2阵列呢?输入数组将是默认数组和db中的第二个数组字


提前感谢大家的回答,并请原谅我对问题中的语法错误表示歉意。

您可以完全在MySQL内部完成向数据库中插入唯一单词的操作,这应该比将所有单词拉入内存、分散它们并发送唯一值要快

要做到这一点,您需要在words列上添加一个唯一的索引。(参考号:)

然后在插入时,您需要在重复键上添加
(Laravel query builder不支持重复键-可以使用raw插入)ref:


我会在重复键上使用,而不是插入忽略。我认为insert ignore可能会隐藏与复制密钥无关的其他潜在问题。

您可以在Laravel 5.5中获得diff two数组,因此:

$words = DB::table('words')->pluck('word')->toArray(); // Collection converted to simple array
您可以使用php中的默认函数获取差异数组:

$result = array_diff($input_default_array, $words);

什么是laravel版本?laravel 5.5@OmisakinOluwatobi@John您唯一要做的是在表中插入不重复的新词吗?是的,但是我的输入词将在默认数组@aknosif中。如果可能的话,我不会麻烦将现有词加载到PHP内部的diff中。如果单词的数量和你说的一样大,那么你将花费大量时间查询/区分数据。您可以完全在MySQLOk中完成同样的事情,您的代码运行良好。以及如何使用这个查询
在重复的关键字=值(word)上插入单词值('foo','bar')在最短的丢失时间内将我的单词从数组添加到数据库?例如,我如何在查询中使用函数DB::insert()添加单词?您能告诉我如何在Laravel 5.5中使用查询吗@Aknosis@John不幸的是,我相信您必须手动构建查询,并在重复的关键字=值(word);]上使用
DB::insert([insert-INTO-word-VALUES(?),(?),$input\u-words)