я делаю панель поиска, которая ищет файлы в каталоге, в котором есть слово, которое нужно найти, затем я хочу, чтобы оно было добавлено в массив по порядку, у которого больше раз слово задается тому, у которого меньше
я работаю на PHP это мой код:
<?php
if(isset($_POST['busqueda'])){
$variable = utf8_encode($_POST['busqueda']);
}
$Array1 = array();
foreach(glob("*.txt") as $filename) {
$contents = file_get_contents($filename);
if (strpos($contents, $variable)){
$Array1[] = $filename;
}
}
* i dont know how to do it exactly, i think that i should use substr_count(file_get_contents($Array1[$position1])) or something like that but im unsure how to make the sorting system, can someone help me! :D*print_r($Array1);
for($var1=0; $var1<sizeof($Array1); $var1++){
echo "times on the file: ".$Array1[$var1]."<br>";
echo substr_count(file_get_contents($Array1[$var1]));
}?>
Вы можете использовать самого substr_count. Затем вам нужно использовать arsort для сортировки массива.
$Array1 = array();
foreach (glob("*.txt") as $filename) {
$contents = file_get_contents($filename);
if ( ($count = substr_count($contents, $variable)) ) {
$Array1[$filename] = $count;
}
}
arsort($Array1) ;
print_r($Array1);
foreach ($Array1 as $file => $count) {
echo "times on the file($file): $count <br>";
}
Bash (доступно по крайней мере в операционных системах Linux и Mac) позволяет чрезвычайно легко выполнить вашу задачу, потому что вы можете вызывать команды через функцию exec PHP, при условии, что она не отключена администратором. Если вы работаете в Windows, то это, вероятно, не сработает, но большинство людей используют Linux для производственной среды, поэтому я подумал, что этот ответ стоит опубликовать.
Следующая функция взята из помощника файла CodeIgniter и служит только для извлечения массива имен файлов из указанного каталога. Если вам не нужна такая функция, потому что вы получаете имена файлов откуда-то еще, просто отметьте, что эта функция может включать полный путь к файлу для каждого файла, и именно поэтому я использовал его.
function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE)
{
static $_filedata = array();
if ($fp = @opendir($source_dir))
{
// reset the array and make sure $source_dir has a trailing slash on the initial call
if ($_recursion === FALSE)
{
$_filedata = array();
$source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
}
while (FALSE !== ($file = readdir($fp)))
{
if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0)
{
get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE);
}
elseif (strncmp($file, '.', 1) !== 0)
{
$_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file;
}
}
return $_filedata;
}
else
{
return FALSE;
}
}
Теперь, когда я могу легко получить массив имен файлов, я сделал бы это:
/**
* Here you can see that I am searching
* all of the files in the script-library
* directory for the word "the"*/
$searchWord = 'the';
$directory = '/var/www/htdocs/script-library';
$filenames = get_filenames(
$directory,
TRUE
);
foreach( $filenames as $file )
{
$counts[$file] = exec("tr ' ' '\n' < " . $file . " | grep " . $searchWord . " | wc -l");
}
arsort( $counts );
echo '<pre>';
print_r( $counts );
echo '</pre>';
Для хорошего объяснения того, как это работает, смотрите это: https://unix.stackexchange.com/questions/2244/how-do-i-count-the-number-of-occurrences-of-a-word-in-a-text-file-with-the-comma
Я тестировал этот код локально, и он прекрасно работает.