Как найти одинаковые строки в php

Имеется txt-файл следующего вида (в нем до 1000 строк):

0 => 112 15 мкр, 4/5, 4 700 000. Tel1
1 => 112 15 мкр, 4/5, 4 800 000. Tel1
2 => 112 14 мкр, Лада, 2/5, 45,3 м2 4 000 000. Tel2
3 => 112 14 мкр, Лада, 2/5, 45,3 м2, 4 000 000. Tel2
4 => 112 15 мкр, 2/5. Tel3
5 => 112 15 мкр, 3/5, 5 000 000 тг. Tel4
6 => 112 15 мкр, 4/5, 5 000 000. Tel1
7 => 112 15 мкр, 4/5, 6 800 000. Tel1
8 => 112 горняков 53, 3/4, не угол, варианты. Tel5
9 => 112 горняков 53, 3/4, не угол. Tel5
10 => 112 Горького 47, 1/4, счетчик, пл. окна, частично мебель, 4 500 000. Tel6
11 => 112 Горького 47, 1/4, хор. ремонт, ч/мебл, 4 500 000. Tel6
12 => 112 Достык, 1/4, кондиционер и кух/гарнитур. Tel7
13 => 112 Железорудная, пл/окна, ремонт, 2 300 000. Tel8

Нужно вывести на экран только повторы для каждой строки в файле, если они есть. Строки считаются одинаковыми, если 1) телефон в конце строк один и тот же и 2) длина всех строк одинаковая (без учета регистра, знаков препинания и пробелов, только буквы и цифры).
Итак, берем первую строку ‘0=>…’, пробежались циклом по всем строкам начиная с ‘1=>…’, вывели на экран. Затем берем вторую строку ‘1=>’ пробежались циклом по всем строкам начиная с ‘2=>…’. То есть, каждую n-строку сравниваем со строками, начиная с n+1-строкой и так до конца документа (именно это я прописал в if).

$arr = file($txt);
foreach($arr as $key=>$item){
    foreach($arr as $nkey=>$nitem){
       if($key != $nkey && $key < $nkey){
          echo '<p>' . $key . ': ' . $arr[$key] . '<p><br>';
          echo '<p>' . $nkey . ': ' . $arr[$nkey] . '<p><br><br>';
       }
    }
}

Это работает нормально, если всего две одинаковые строки. А теперь представьте, если их 10 штук идущих друг за другом в документе… На первом шаге цикла искомая строка выведется с 9 найденными повторами (здесь порядок). Но ведь потом мы продолжаем искать повторы для следующей строки. И выходит, что на втором шаге цикла выводится 2 строка, которую мы видели на первом шаге, и 8 найденных повторов (которые мы тоже видели на первом шаге). Теперь иллюстрация, как это выглядит у меня на основе строк, которые показал в начале:

__112   15 мкр, 4/5, 4 700 000. Tel1__ (строка "0=>..." и ее повторы, здесь порядок)
112 15 мкр, 4/5, 4 800 000. Tel1
112 15 мкр, 4/5, 5 000 000. Tel1
112 15 мкр, 4/5, 6 800 000. Tel1

__112   15 мкр, 4/5, 4 800 000. Tel1__ (не должно выводиться, дублирование)
112 15 мкр, 4/5, 5 000 000. Tel1
112 15 мкр, 4/5, 6 800 000. Tel1

__112   15 мкр, 4/5, 5 000 000. Tel1__ (не должно выводиться, дублирование)
112 15 мкр, 4/5, 6 800 000. Tel1


__112   14 мкр, Лада, 2/5, 45,3 м2 4 000 000. Tel2__
112 14 мкр, Лада, 2/5, 45,3 м2, 4 000 000. Tel2

__112   горняков 53, 3/4, не угол, варианты. Tel5__
112 горняков 53, 3/4, не угол. Tel5

__112   Горького 47, 1/4, счетчик, пл. окна, частично мебель, 4 500 000. Tel6__
112 Горького 47, 1/4, хор. ремонт, ч/мебл, 4 500 000. Tel6

Теперь как должно быть:

__112   15 мкр, 4/5, 4 700 000. Tel1__
112 15 мкр, 4/5, 4 800 000. Tel1
112 15 мкр, 4/5, 5 000 000. Tel1
112 15 мкр, 4/5, 6 800 000. Tel1

__112   14 мкр, Лада, 2/5, 45,3 м2 4 000 000. Tel2__
112 14 мкр, Лада, 2/5, 45,3 м2, 4 000 000. Tel2

__112   горняков 53, 3/4, не угол. Tel5__
112 горняков 53, 3/4, не угол. Tel5

__112   Горького 47, 1/4, счетчик, пл. окна, частично мебель, 4 500 000. Tel6__
112 Горького 47, 1/4, хор. ремонт, ч/мебл, 4 500 000. Tel6

Прошу прощения за размытые объяснения. Как не выводить на экран десять раз одно и то же? Спасибо!

Вы можете использовать array_reduce() и array_filter():

<?php

$data = array(
    array(
        'id' => 1,
        'timestamp' => 1503050400,
        'name' => 'Event A',
        'value' => null,
    ),
    array(
        'id' => 2,
        'timestamp' => 1503446400,
        'name' => 'Event B',
        'value' => null,
    ),
    array(
        'id' => 2,
        'timestamp' => 1503446400,
        'name' => 'Event B',
        'value' => 71,
    ),
    array(
        'id' => 3,
        'timestamp' => 1503720000,
        'name' => 'Event C',
        'value' => 12,
    ),
    array(
        'id' => 3,
        'timestamp' => 1503720000,
        'name' => 'Event C',
        'value' => null,
    ),
);

/**
 * Reduce the array of items to an array of buckets, where
 * each bucket contains elements with the same
 *
 * - id
 * - timestamp
 * - name
 *
 * so that we can than take a look at the contents of the
 * individual buckets.
 */
$buckets = array_reduce(
    $data,
    function (array $carry, array $item) {
        /**
         * create an index from
         *
         * - id
         * - timestamp
         * - name
         */
        $index = serialize(array(
            'id' => $item['id'],
            'timestamp' => $item['timestamp'],
            'name' => $item['name'],
        ));

        /**
         * initialize empty bucket if we don't have one yet for this index
         */
        if (!array_key_exists($index, $carry)) {
            $carry[$index] = array();
        }

        /**
         * add item to bucket
         */
        $carry[$index][] = $item;

        return $carry;
    },
    array()
);

/**
 * Reduce the content of the buckets to elements that match the requirements.
 */
$filtered = array_reduce(
    $buckets,
    function (array $carry, array $items) {
        /**
         * if we have only one item in the bucket, let take it
         */
        if (1 === count($items)) {
            $carry[] = array_shift($items);

            return $carry;
        }

        /**
         * find all items where the value is not null
         */
        $withoutNullValue = array_filter($items, function (array $item) {
            return array_key_exists('value', $item) && null !== $item['value'];
        });

        /**
         * if we have any items where the value is not null, take all of them
         */
        if (0 < count($withoutNullValue)) {
            $carry = array_merge(
                $carry,
                $withoutNullValue
            );

            return $carry;
        }

        /**
         * if all of the items have a value of null, let just take the first
         */
        $carry[] = array_shift($items);

        return $carry;
    },
    array()
);

var_dump($filtered);

Для справки см.:

  • http://php.net/manual/en/function.array-reduce.php
  • http://php.net/manual/en/function.array-filter.php

Например, см.

  • https://3v4l.org/Toq75

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_uniqueУбирает повторяющиеся значения из массива

Описание

array_unique(array $array, int $flags = SORT_STRING): array

Обратите внимание, что ключи сохранятся. Если в соответствии с заданными
flags несколько элементов определяются как
идентичные, то будут сохранены ключ и значение первого такого элемента.

Замечание:

Два элемента считаются одинаковыми в том и только в том случае, если
(string) $elem1 === (string) $elem2. Другими словами:
если у них одинаковое строковое представление, то будет использован первый элемент.

Список параметров

array

Входной массив.

flags

Можно использовать необязательный второй параметр flags
для изменения поведения сравнения с помощью следующих значений:

Флаги видов сравнения:

  • SORT_REGULAR – нормальное сравнение элементов
    (типы не меняются)
  • SORT_NUMERIC – элементы сравниваются как числа
  • SORT_STRING – элементы сравниваются как строки
  • SORT_LOCALE_STRING – сравнивает элементы как строки,
    с учётом текущей локали.

Возвращаемые значения

Возвращает отфильтрованный массив.

Список изменений

Версия Описание
7.2.0 Если flags равен
SORT_STRING, ранее массив
array копировался, а не уникальные элементы
удалялись (сохраняя значения цифровых индексов),
но теперь создаётся новый массив путём добавления уникальных элементов.
Это может привести к различным числовым индексам.

Примеры

Пример #1 Пример использования array_unique()


<?php
$input
= array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
?>

Результат выполнения данного примера:

Array
(
    [a] => green
    [0] => red
    [1] => blue
)

Пример #2 array_unique() и типы:


<?php
$input
= array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
?>

Результат выполнения данного примера:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}

Примечания

Замечание:

Обратите внимание, что array_unique() не предназначена
для работы с многомерными массивами.

Ghanshyam Katriya(anshkatriya at gmail)

8 years ago


Create multidimensional array unique for any single key index.

e.g I want to create multi dimentional unique array for specific code

Code :

My array is like this,

<?php

$details
= array(

   
0 => array("id"=>"1", "name"=>"Mike",    "num"=>"9876543210"),

   
1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"),

   
2 => array("id"=>"1", "name"=>"Mathew""num"=>"784581254"),

);

?>



You can make it unique for any field like id, name or num.

I have develop this function for same :

<?php

function unique_multidim_array($array, $key) {

   
$temp_array = array();

   
$i = 0;

   
$key_array = array();

   
    foreach(

$array as $val) {

        if (!
in_array($val[$key], $key_array)) {

           
$key_array[$i] = $val[$key];

           
$temp_array[$i] = $val;

        }

       
$i++;

    }

    return
$temp_array;

}

?>



Now, call this function anywhere from your code,

something like this,

<?php

$details
= unique_multidim_array($details,'id');

?>



Output will be like this :

<?php

$details
= array(

   
0 => array("id"=>"1","name"=>"Mike","num"=>"9876543210"),

   
1 => array("id"=>"2","name"=>"Carissa","num"=>"08548596258"),

);

?>


Mike D. – michal at euro-net.pl

5 months ago


modified code originally posted by Ghanshyam Katriya(anshkatriya at gmail) [highest voted comment here].

1. In php 7.4 counter $i breaks the function. Removed completely (imo was waste of keystrokes anyway).
2. I added second return value - array of duplicates. So you can take both and compare them (I had to).

Example array (copy-paste from original post):
<?php
$details
= array(
   
0 => array("id"=>"1", "name"=>"Mike",    "num"=>"9876543210"),
   
1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"),
   
2 => array("id"=>"1", "name"=>"Mathew""num"=>"784581254"),
);
?>

Function:
<?php
function unique_multidim_array($array, $key) : array {
   
$uniq_array = array();
   
$dup_array = array();
   
$key_array = array();

    foreach(

$array as $val) {
        if (!
in_array($val[$key], $key_array)) {
           
$key_array[] = $val[$key];
           
$uniq_array[] = $val;
/*
            # 1st list to check:
            # echo "ID or sth: " . $val['building_id'] . "; Something else: " . $val['nodes_name'] . (...) "n";
*/
       
} else {
           
$dup_array[] = $val;
/*
            # 2nd list to check:
            # echo "ID or sth: " . $val['building_id'] . "; Something else: " . $val['nodes_name'] . (...) "n";
*/
       
}
    }
    return array(
$uniq_array, $dup_array, /* $key_array */);
}
?>

Usage:
<?php
list($unique_addresses, $duplicates, /* $unique_keys */) = unique_multidim_array($details,'id');
?>

Then:
var_dump($unique_addresses);
or
var_dump($duplicates);
or foreach or whatever. Personally I just echo-ed 1st and then 2nd (both DOUBLE COMMENTED) list in function itself (then copied both to notepad++ and compared them - just to be 100% sure), but in case you want to do something else with it - enjoy :)
Plus - as a bonus - you also get an array of UNIQUE keys you searched for (just uncomment >$key_array< in both: function return and function call code).

From example array code returns:
var_dump($unique_addresses);
array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(4) "Mike"
    ["num"]=>
    string(10) "9876543210"
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(1) "2"
    ["name"]=>
    string(7) "Carissa"
    ["num"]=>
    string(11) "08548596258"
  }
}

var_dump($duplicates);
array(1) {
  [0]=>
  array(3) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(6) "Mathew"
    ["num"]=>
    string(9) "784581254"
  }
}

Plus keys, if you want.

P.S.: in my - practical - case of DB querying I got around 4k uniques and 15k dupes :)


falundir at gmail dot com

4 years ago


I find it odd that there is no version of this function which allows you to use a comparator callable in order to determine items equality (like array_udiff and array_uintersect). So, here's my version for you:

<?php
function array_uunique(array $array, callable $comparator): array {
   
$unique_array = [];
    do {
       
$element = array_shift($array);
       
$unique_array[] = $element;$array = array_udiff(
           
$array,
            [
$element],
           
$comparator
       
);
    } while (
count($array) > 0);

    return

$unique_array;
}
?>

And here is a test code:

<?php
class Foo {

    public

$a;

    public function

__construct(int $a) {
       
$this->a = $a;
    }
}
$array_of_objects = [new Foo(2), new Foo(1), new Foo(3), new Foo(2), new Foo(2), new Foo(1)];$comparator = function (Foo $foo1, Foo $foo2): int {
    return
$foo1->a <=> $foo2->a;
};
var_dump(array_uunique($array_of_objects, $comparator)); // should output [Foo(2), Foo(1), Foo(3)]
?>


stoff@

6 years ago


In reply to performance tests array_unique vs foreach.

In PHP7 there were significant changes to Packed and Immutable arrays resulting in the performance difference to drop considerably. Here is the same test on php7.1 here;
http://sandbox.onlinephpfunctions.com/code/2a9e986690ef8505490489581c1c0e70f20d26d1

$max = 770000; //large enough number within memory allocation
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);
echo "deduped to ".count($res1)." in ".$time;
// deduped to 513333 in 1.0876770019531

$time = -microtime(true);
$res2 = array();
foreach($arr as $key=>$val) {   
    $res2[$val] = true;
}
$res2 = array_keys($res2);
$time += microtime(true);
echo "<br />deduped to ".count($res2)." in ".$time;
// deduped to 513333 in 0.054931879043579


Anonymous

12 years ago


It's often faster to use a foreache and array_keys than array_unique:

    <?php

    $max

= 1000000;

   
$arr = range(1,$max,3);

   
$arr2 = range(1,$max,2);

   
$arr = array_merge($arr,$arr2);
$time = -microtime(true);

   
$res1 = array_unique($arr);

   
$time += microtime(true);

    echo
"deduped to ".count($res1)." in ".$time;

   
// deduped to 666667 in 32.300781965256
$time = -microtime(true);

   
$res2 = array();

    foreach(
$arr as $key=>$val) {   

       
$res2[$val] = true;

    }

   
$res2 = array_keys($res2);

   
$time += microtime(true);

    echo
"<br />deduped to ".count($res2)." in ".$time;

   
// deduped to 666667 in 0.84372591972351
?>


Ray dot Paseur at SometimesUsesGmail dot com

15 years ago


I needed to identify email addresses in a data table that were replicated, so I wrote the array_not_unique() function:

<?phpfunction array_not_unique($raw_array) {
   
$dupes = array();
   
natcasesort($raw_array);
   
reset ($raw_array);$old_key    = NULL;
   
$old_value    = NULL;
    foreach (
$raw_array as $key => $value) {
        if (
$value === NULL) { continue; }
        if (
$old_value == $value) {
           
$dupes[$old_key]    = $old_value;
           
$dupes[$key]        = $value;
        }
       
$old_value    = $value;
       
$old_key    = $key;
    }
return
$dupes;
}
$raw_array     = array();
$raw_array[1]    = 'abc@xyz.com';
$raw_array[2]    = 'def@xyz.com';
$raw_array[3]    = 'ghi@xyz.com';
$raw_array[4]    = 'abc@xyz.com'; // Duplicate$common_stuff    = array_not_unique($raw_array);
var_dump($common_stuff);
?>


mnbayazit

15 years ago


Case insensitive; will keep first encountered value.

<?php
function array_iunique($array) {

   
$lowered = array_map('strtolower', $array);

    return
array_intersect_key($array, array_unique($lowered));

}
?>


Fabiano

5 years ago


As for PHP 7.1.12, this is the comparison between array_keys(array_flip()), array_flip(array_flip()), for each elimination and array_unique. The array_keys(array_flip()) is the fastest method to remove duplication values from a single dimension array:

<?php

$max

= 1000000;
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);

echo

"<br>deduped to ".count($res1)." in ".$time;
// deduped to 666667 in 0.78185796737671
// memory used: 33558528
$time = -microtime(true);
$res2 = array_flip(array_flip($arr));
$time += microtime(true);

echo

"<br><br>deduped to ".count($res2)." in ".$time;
// deduped to 666667 in 0.072191953659058
// memory used: 3774873
$time = -microtime(true);
$res3 = array();
foreach(
$arr as $key=>$val) {
   
$res3[$val] = true;
}
$res3 = array_keys($res3);
$time += microtime(true);

echo

"<br /><br>deduped to ".count($res3)." in ".$time;
// deduped to 666667 in 0.095494985580444
// memory used: 33558528
$time = -microtime(true);
$res4 = array_keys(array_flip($arr));
$time += microtime(true);

echo

"<br /><br>deduped to ".count($res4)." in ".$time;
// deduped to 666667 in 0.05807900428772
// memory used: 33558528


keneks at gmail dot com

16 years ago


Taking the advantage of array_unique, here is a simple function to check if an array has duplicate values.

It simply compares the number of elements between the original array and the array_uniqued array.

<?php
function array_has_duplicates(array $array)

{

   
$uniq = array_unique($array);

    return
count($uniq) != count($array);

}
?>


contact at evoweb dot fr

2 years ago


Here is a solution to make unique values keeping empty values for an array with keys :

<?php
function array_unique_kempty($array) {
   
$values = array_unique($array);
   
$return = array_combine(array_keys($array), array_fill(0,count($array),null));
    return
array_merge($return,$values);
}
$myArray = [
   
"test1" => "aaa",
   
"test2" => null,
   
"test3" => "aaa",
   
"test4" => "bbb",
   
"test5" => null,
   
"test6" => "ccc",
   
"test7" => "ddd",
   
"test8" => "ccc"
];

echo

"<pre>".print_r(array_unique_kempty($myArray),true)."</pre>";/*
Array
(
    [test1] => aaa
    [test2] =>
    [test3] =>
    [test4] => bbb
    [test5] =>
    [test6] => ccc
    [test7] => ddd
    [test8] =>
)
*/
?>


calexandrepcjr at gmail dot com

5 years ago


Following the Ghanshyam Katriya idea, but with an array of objects, where the $key is related to object propriety that you want to filter the uniqueness of array:

<?php
function obj_multi_unique($obj, $key = false)
    {
       
$totalObjs = count($obj);
        if (
is_array($obj) && $totalObjs > 0 && is_object($obj[0]) && ($key && !is_numeric($key))) {
            for (
$i = 0; $i < $totalObjs; $i++) {
                if (isset(
$obj[$i])) {
                    for (
$j = $i + 1; $j < $totalObjs; $j++) {
                        if (isset(
$obj[$j]) && $obj[$i]->{$key} === $obj[$j]->{$key}) {
                            unset(
$obj[$j]);
                        }
                    }
                }
            }
            return
array_values($obj);
        } else {
            throw new
Exception('Invalid argument or your array of objects is empty');
        }
    }
?>


regeda at inbox dot ru

13 years ago


recursive array unique for multiarrays

<?php
function super_unique($array)
{
 
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));

  foreach (

$result as $key => $value)
  {
    if (
is_array($value) )
    {
     
$result[$key] = super_unique($value);
    }
  }

  return

$result;
}
?>


mostafatalebi at rocketmail dot com

9 years ago


If you find the need to get a sorted array without it preserving the keys, use this code which has worked for me:

<?php

$array

= array("hello", "fine", "good", "fine", "hello", "bye");
$get_sorted_unique_array = array_values(array_unique($array));
?>



The above code returns an array which is both unique and sorted from zero.


sashasimkin at gmail dot com

11 years ago


My object unique function:

<?php
function object_unique( $obj ){
   
$objArray = (array) $obj;$objArray = array_intersect_assoc( array_unique( $objArray ), $objArray );

    foreach(

$obj as $n => $f ) {
        if( !
array_key_exists( $n, $objArray ) ) unset( $obj->$n );
    }

    return

$obj;
}
?>

And these code:

<?php
class Test{
    public
$pr0 = 'string';
    public
$pr1 = 'string1';
    public
$pr2 = 'string';
    public
$pr3 = 'string2';
}
$obj = new Test;var_dump( object_unique( $obj ) );
?>

returns:
object(Test)[1]
  public 'pr0' => string 'string' (length=6)
  public 'pr1' => string 'string1' (length=7)
  public 'pr3' => string 'string2' (length=7)


agarcia at rsn dot com dot co

17 years ago


This is a script for multi_dimensional arrays

<?php

function remove_dup($matriz) {

   
$aux_ini=array();

   
$entrega=array();

    for(
$n=0;$n<count($matriz);$n++)

    {

       
$aux_ini[]=serialize($matriz[$n]);

    }

   
$mat=array_unique($aux_ini);

    for(
$n=0;$n<count($matriz);$n++)

    {
$entrega[]=unserialize($mat[$n]);

       
    }

    return

$entrega;

}

?>


Ludovico Grossi

8 years ago


[Editor's note: please note that this will not work well with non-scalar values in the array. Array keys can not be arrays themselves, nor streams, resources, etc. Flipping the array causes a change in key-name]

You can do a super fast version of array_unique directly in PHP, even faster than the other solution posted in the comments!

Compared to the built in function it is 20x faster! (2x faster than the solution in the comments).

<?php

function superfast_array_unique($array) {

    return
array_keys(array_flip($array));

}

?>



This works faster for small and big arrays.


quecoder at gmail

14 years ago


another method to get unique values is :

<?php

$alpha
=array('a','b','c','a','b','d','e','f','f');
$alpha= array_keys(array_count_values($alpha));
print_r($alpha);

?>



Output:

Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f )


jusvalceanu – SPAM at SPAM – yahoo dot com

14 years ago


so .... my problem was multidimensional sort.

<?php

      $new
= array();

     
$exclude = array("");

      for (
$i = 0; $i<=count($attribs)-1; $i++) {

         if (!
in_array(trim($attribs[$i]["price"]) ,$exclude)) { $new[] = $attribs[$i]; $exclude[] = trim($attribs[$i]["price"]); }

      }
?>



Array $attribs is an array contaning arrays. Each array in the $attrib array consists in multiple fields (ex: name, lenght, price, etc.) to be more simpler in speech think that $attrib is the array resulted by a search sql query done by a visitator on your online shoopping website ... (so ... each array in the $attrib is a product :P) if you want to sort only the uniq results use the above or use this:

<?php
/* Our Array of products */

  
$attribs[] = array(

                          
"name"         => "Test Product 1",

                          
"length"     => "42 cm",

                          
"weight"     => "0,5 kg",

                          
"price"     => "10 $",

                          
"stock"     => "100",

                        );
$attribs[] = array(

                          
"name"         => "Test Product 2",

                          
"length"     => "42 cm",

                          
"weight"     => "1,5 kg",

                          
"price"     => "10 $",

                          
"stock"     => "200",

                        );
/* The nice stuff */
$new = array();

     
$exclude = array("");

      for (
$i = 0; $i<=count($attribs)-1; $i++) {

         if (!
in_array(trim($attribs[$i]["price"]) ,$exclude)) { $new[] = $attribs[$i]; $exclude[] = trim($attribs[$i]["price"]); }

      }
print_r($new); // $new is our sorted array
?>



Have fun tweaking this ;)) i know you will ;))

From Romania With Love


subhrajyoti dot de007 at gmail dot com

4 years ago


Simple and clean way to get duplicate entries removed from a multidimensional array.

<?php
          $multi_array
= $multi_array [0];
         
$multi_array = array_unique($multi_array);
         
print_r($multi_array);
?>


webmaster at jukkis dot net

15 years ago


Another way to 'unique column' an array, in this case an array of objects:
Keep the desired unique column values in a static array inside the callback function for array_filter.

Example:
<?php
/* example object */
class myObj {
  public
$id;
  public
$value;
  function
__construct( $id, $value ) {
   
$this->id = $id;
   
$this->value = $value;
  }
}
/* callback function */
function uniquecol( $obj ) {
  static
$idlist = array();

  if (

in_array( $obj->id, $idlist ) )
    return
false;$idlist[] = $obj->id;
  return
true;   
}
/* a couple of arrays with second array having an element with same id as the first */
$list  = array( new myObj( 1, ), new myObj( 2, 100 ) );
$list2 = array( new myObj( 1, 10 ), new myObj( 3, 100 ) );
$list3 = array_merge( $list, $list2 );$unique = array_filter( $list3, 'uniquecol' );
print_r( $list3 );
print_r( $unique );?>

In addition, use array_merge( $unique ) to reindex.


zoolyka at gmail dot com

7 years ago


I found the simplest way to "unique" multidimensional arrays as follows:

<?php

$array

= array(
   
'a' => array(1, 2),
   
'b' => array(1, 2),
   
'c' => array(2, 2),
   
'd' => array(2, 1),
   
'e' => array(1, 1),
);
$array = array_map('json_encode', $array);
$array = array_unique($array);
$array = array_map('json_decode', $array);print_r($array);?>

As you can see "b" will be removed without any errors or notices.


amri [ at t] dhstudio dot eu

13 years ago


I searched how to show only the de-duplicate elements from array, but failed.

Here is my solution:

<?php

function arrayUniqueElements($array)

{

return
array_unique(array_diff_assoc($array1,array_unique($array1)));

};

?>



Example:

<?php

$arr1
= array('foo', 'bar', 'xyzzy', '&', 'xyzzy',

'baz', 'bat', '|', 'xyzzy', 'plugh',

'xyzzy', 'foobar', '|', 'plonk', 'xyzzy',

'apples', '&', 'xyzzy', 'oranges', 'xyzzy',

'pears','foobar');
$result=arrayUniqueElements($arr1);

print_r($result);exit;

?>



Output:

Array

(

[4] => xyzzy

[12] => |

[16] => &

[21] => foobar

)


csaba at alum dot mit dot edu

18 years ago


The following is an efficient, adaptable implementation of array_unique which always retains the first key having a given value:

<?php

function array_unique2(&$aray) {

   
$aHash = array();

    foreach (
$aray as $key => &$val) if (@$aHash[$val]++) unset ($aray[$key]);

}

?>



It is also adaptable to multi dimensional arrays.  For example, if your array is a sequence of (multidimensional) points, then in place of @$aHash[$val]++ you could use @$aHash[implode("X",$val)]++

If you want to not have holes in your array, you can do an array_merge($aray) at the end.

Csaba Gabor


Sbastien

11 months ago


Because of PHP comparaisons modalities, you can never distinguish null from others falsy values.
Note the absorbing nature of true and false booleans in mix types array.

<?php

$a

= [true, false, null, '', '0', '123', 0, 123];
foreach ([
'SORT_REGULAR', 'SORT_NUMERIC', 'SORT_STRING', 'SORT_LOCALE_STRING'] as $flag) {
   
$a_new = array_unique($a, constant($flag));
    echo
"{$flag} ==> ";
   
var_dump($a_new);
}
/*

Gives :

SORT_REGULAR ==> array(2) {
  [0]=> bool(true)
  [1]=> bool(false)
}
SORT_NUMERIC ==> array(3) {
  [0]=> bool(true)
  [1]=> bool(false)
  [5]=> string(3) "123"
}
SORT_STRING ==> array(4) {
  [0]=> bool(true)
  [1]=> bool(false)
  [4]=> string(1) "0"
  [5]=> string(3) "123"
}
SORT_LOCALE_STRING ==> array(4) {
  [0]=> bool(true)
  [1]=> bool(false)
  [4]=> string(1) "0"
  [5]=> string(3) "123"
}

*/


Victoire Nkolo at crinastudio.com

2 months ago


<?php//removes duplicated objetcs from an array according to the property givenclass ArrayFilter
{

    public static function

dedupe_array_of_objets(array $array, string $property) : array
    {
       
$i = 0;
       
$filteredArray = array();
       
$keyArray = array();

        foreach(

$array as $item) {
            if (!
in_array($item->$property, $keyArray)) {
               
$keyArray[$i] = $item->$property;
               
$filteredArray[$i] = $item;
            }
           
$i++;
        }
        return
$filteredArray;
    }
}


tasiot

5 months ago


array_unique is not compatible with php 8.1 enums because enums don't have a string representation yet (even the BackedEnum of string type…).
You get an error: "Object of class XXXX could not be converted to string."

So I wrote this function that creates a string representation of the enums and use the array keys to remove duplicates:

<?phpfunction array_unique_81(array $values): array
{
   
$unique = [];
    foreach (
$values as $value) {
        if (
$value instanceof UnitEnum) {
           
$key = 'e:' . get_class($value) . ':' . $value->name;
        } else {
           
$key = 's:' . (string)$value;
        }
       
$unique[$key] = $value;
    }
    return
array_values($unique);
}
?>


free dot smilesrg at gmail dot com

6 months ago


$a = new StdClass();
$b = new StdClass();

var_dump(array_unique([$a, $b, $b, $a], SORT_REGULAR));
//array(1) {
//  [0]=>
//    object(stdClass)#1 (0) {
//  }
//}

$a->name = 'One';
$b->name = 'Two';

var_dump(array_unique([$a, $b, $b, $a], SORT_REGULAR));

//array(2) {
//  [0]=>
//  object(stdClass)#1 (1) {
//    ["name"]=>
//    string(3) "One"
//  }
//  [1]=>
//  object(stdClass)#2 (1) {
//    ["name"]=>
//    string(3) "Two"
//  }
//}


dirk dot avery a t gmail

14 years ago


Although array_unique is not intended to work with multi-dimensional arrays, it does on 5.2.9.  However, it does not for 5.2.5.  Beware.

Dorphalsig

14 years ago


I had a problem with array_unique and multidimensional arrays ... Maybe there's a better way to do this, but this will work for any dimensional arrays.

<?php

function arrayUnique($myArray)

{

    if(!
is_array($myArray))

           return
$myArray;

    foreach (

$myArray as &$myvalue){

       
$myvalue=serialize($myvalue);

    }
$myArray=array_unique($myArray);

    foreach (

$myArray as &$myvalue){

       
$myvalue=unserialize($myvalue);

    }

    return

$myArray;

}

?>


PHP Expert

15 years ago


Case insensitive for PHP v4.x and up.

<?php
function in_iarray($str, $a) {

    foreach (
$a as $v) {

        if (
strcasecmp($str, $v) == 0) {

            return
true;

        }

    }

    return
false;

}

function

array_iunique($a) {

   
$n = array();

    foreach (
$a as $k => $v) {

        if (!
in_iarray($v, $n)) {

           
$n[$k]=$v;

        }

    }

    return
$n;

}
$input = array("aAa","bBb","cCc","AaA","ccC","ccc","CCC","bBB","AAA","XXX");

$result = array_iunique($input);

print_r($result);
/*

Array

(

    [0] => aAa

    [1] => bBb

    [2] => cCc

    [9] => XXX

)

*/

?>


geuis dot teses at gmail dot com

16 years ago


Here's the shortest line of code I could find/create to remove all duplicate entries from an array and then reindex the keys.

<?php
// Fruits, vegetables, and other food:

$var = array('apple','banana','carrot','cat','dog','egg','eggplant','fish');
$var = array_values(array_unique($var));

?>


memandeemail at gmail dot com

17 years ago


Problem:

I have loaded an array with the results of a database

query.  The Fields are 'FirstName' and 'LastName'.

I would like to find a way to contactenate the two

fields, and then return only unique values for the

array.  For example, if the database query returns

three instances of a record with the FirstName John

and the LastName Smith in two distinct fields, I would

like to build a new array that would contain all the

original fields, but with John Smith in it only once.

Thanks for: Colin Campbell

Solution:

<?php

/**

* The same thing than implode function, but return the keys so

*

* <code>

* $_GET = array('id' => '4587','with' => 'key');

* ...

* echo shared::implode_with_key('&',$_GET,'='); // Resultado: id=4587&with=key

* ...

* </code>

*

* @param string $glue Oque colocar entre as chave => valor

* @param array $pieces Valores

* @param string $hifen Separar chave da array do valor

* @return string

* @author memandeemail at gmail dot com

*/

function implode_with_key($glue = null, $pieces, $hifen = ',') {

 
$return = null;

  foreach (
$pieces as $tk => $tv) $return .= $glue.$tk.$hifen.$tv;

  return
substr($return,1);

}
/**

* Return unique values from a tree of values

*

* @param array $array_tree

* @return array

* @author memandeemail at gmail dot com

*/

function array_unique_tree($array_tree) {

 
$will_return = array(); $vtemp = array();

  foreach (
$array_tree as $tkey => $tvalue) $vtemp[$tkey] = implode_with_key('&',$tvalue,'=');

  foreach (
array_keys(array_unique($vtemp)) as $tvalue) $will_return[$tvalue] = $array_tree[$tvalue];

  return
$will_return;

}
$problem = array_fill(0,3,

array(
'FirstName' => 'John', 'LastName' => 'Smith')

);
$problem[] = array('FirstName' => 'Davi', 'LastName' => 'S. Mesquita');

$problem[] = array('FirstName' => 'John', 'LastName' => 'Tom');
print_r($problem);
print_r(array_unique_tree($problem));

?>


У меня есть сайт, на котором пользователи могут написать описание о себе.

Большинство пользователей пишут что-то подходящее, но некоторые просто копируют/вставляют один и тот же текст несколько раз (чтобы создать видимость большого количества текста).

например: “Любовь и мир, любовь и мир, любовь и мир, любовь и мир, любовь и мир, любовь и мир”.

Есть ли хороший метод для обнаружения повторяющегося текста с PHP?

Единственная концепция, которую я имею в настоящее время, – это разбить текст на отдельные слова (ограниченные пробелом), а затем посмотреть, повторяется ли слово больше, чем набор ограничен. Примечание. Я не уверен на 100%, как бы я закодировал это решение.

Мысли о лучшем способе обнаружения повторяющегося текста? Или как закодировать приведенную выше идею?

4b9b3361

Ответ 1

Это основная проблема классификации текста. lots статьи о том, как определить, если какой-то текст – это спам/не спам, который я бы рекомендовал копать, если вы действительно хотите вдаваться в подробности. Многое из этого, вероятно, слишком велико для того, что вам нужно сделать здесь.

Предполагается, что один из подходов будет состоять в том, чтобы оценить, почему вы требуете от людей ввода более длинных биографий, но я предполагаю, что вы уже решили, что заставить людей вводить больше текста – это путь.

Вот очертания того, что я буду делать:

  • Построить гистограмму вхождения слов для строки ввода
  • Изучите гистограммы некоторого допустимого и недопустимого текста
  • Придумайте формулу для классификации гистограммы как действительной или нет

Этот подход потребует, чтобы вы выяснили, что другое между этими двумя наборами. Интуитивно я ожидал бы, что спам будет показывать меньше уникальных слов, и если вы построите значения гистограммы, более высокая область под кривой будет сосредоточена в верхних словах.

Вот пример кода для вас:

$str = 'Love a and peace love a and peace love a and peace love a and peace love a and peace love a and peace';

// Build a histogram mapping words to occurrence counts
$hist = array();

// Split on any number of consecutive whitespace characters
foreach (preg_split('/s+/', $str) as $word)
{
  // Force all words lowercase to ignore capitalization differences
  $word = strtolower($word);

  // Count occurrences of the word
  if (isset($hist[$word]))
  {
    $hist[$word]++;
  }
  else
  {
    $hist[$word] = 1;
  }
}

// Once you're done, extract only the counts
$vals = array_values($hist);
rsort($vals); // Sort max to min

// Now that you have the counts, analyze and decide valid/invalid
var_dump($vals);

Когда вы запустите этот код в некоторых повторяющихся строках, вы увидите разницу. Здесь график массива $vals из строки примера, которую вы указали:

повторяющийся

Сравните это с первыми двумя параграфами Martin Luther King Jr. bio из Википедии:

mlk

Длинный хвост указывает много уникальных слов. Там еще некоторое повторение, но общая форма показывает некоторые изменения.

FYI, PHP имеет stats пакет, который вы можете установить, если вы собираетесь делать много математики, как стандартное отклонение, распределение моделирование и т.д.

Ответ 2

Вы можете использовать регулярное выражение, например:

if (preg_match('/(.{10,})\1{2,}/', $theText)) {
    echo "The string is repeated.";
}

Пояснение:

  • (.{10,}) ищет и фиксирует строку длиной не менее 10 символов
  • \1{2,} ищет первую строку как минимум еще 2 раза

Возможные настройки в соответствии с вашими потребностями:

  • Измените 10 на более высокое или меньшее число, чтобы соответствовать более длинным или коротким повторяющимся строкам. Я просто использовал 10 в качестве примера.
  • Если вы хотите поймать хотя бы одно повторение (love and peace love and peace), удалите {2,}. Если вы хотите поймать большее количество повторений, увеличьте 2.
  • Если вам все равно, сколько раз повторение происходит, только это происходит, удалите , в {2,}.

Ответ 3

Я думаю, что вы на правильном пути разбиваете струну и смотрите на повторяющиеся слова.

Вот какой код, который не использует PCRE и использует встроенные строковые функции PHP (str_word_count и array_count_values ​​):

<?php
    $words = str_word_count("Love a and peace love a and peace love a and peace love a and peace love a and peace love a and peace", 1);
    $words = array_count_values($words);

  var_dump($words);
  /*
  array(5) {
    ["Love"]=>
    int(1)
    ["a"]=>
    int(6)
    ["and"]=>
    int(6)
    ["peace"]=>
    int(6)
    ["love"]=>
    int(5)
  }
  */

Некоторые настройки могут быть следующими:

  • настроить список общих слов, которые нужно игнорировать
  • посмотрите на порядок слов (предыдущий и следующий), а не только количество вхождений

Ответ 4

Еще одна идея – использовать substr_count итерацию:

$str = "Love a and peace love a and peace love a and peace love a and peace love a and peace love a and peace";

$rep = "";

$str = strtolower($str);
for($i=0,$len=strlen($str),$pattern=""; $i<$len; ++$i) {
  $pattern.= $str[$i];
  if(substr_count($str,$pattern)>1)
    $rep = strlen($rep)<strlen($pattern) ? $pattern : $rep;
  else
    $pattern = "";
}

// warn if 20%+ of the string is repetitive
if(strlen($rep)>strlen($str)/5) echo "Repetitive string alert!";
else echo "String seems to be non-repetitive.";

echo " Longest pattern found: '$rep'";

Что бы вывести

Repetitive string alert! Longest pattern found: 'love a and peace love a and peace love a and peace'

Ответ 5

// 3 examples of how you might detect repeating user input

// use preg_match

// pattern to match agains
$pattern = '/^text goes here$/';

// the user input
$input = 'text goes here';

// check if its match
$repeats = preg_match($pattern, $input);

if ($repeats) {
    var_dump($repeats);
} else {
    // do something else
}

// use strpos

$string = 'text goes here';
$input = 'text goes here';
$repeats = strpos($string, $input);

if ($repeats !== false) {
    # code...
    var_dump($repeats);
} else {
    // do something else
}

// or you could do something like:
function repeatingWords($str)
{
    $words = explode(' ', trim($str));  //Trim to prevent any extra blank
    if (count(array_unique($words)) == count($words)) {
        return true; //Same amount of words
    }

    return false;
}

$string = 'text goes here. text goes here. ';

if (repeatingWords($string)) {
    var_dump($string);
} else {
    // do something else
}

Ответ 6

Я думаю, что подход к поиску повторяющихся слов будет беспорядочным. Скорее всего, вы получите повторяющиеся слова в реальных описаниях: “Я действительно, действительно, действительно, как мороженое, особенно ванильный мороженое”.

Лучший подход состоит в том, чтобы разбить строку, чтобы получить слова, найти все уникальные слова, добавить все число символов уникальных слов и установить слишком ограниченное число. Скажем, вам требуется 100 символов, требуется около 60 уникальных символов из слов.

Копирование подхода @ficuscr

$words = str_word_count("Love a and peace love a and peace love a and peace love a and peace love a and peace love a and peace", 1);
$total = 0;
foreach ($words as $key => $count) { $total += strlen($key) }

Ответ 7

Здесь приведен код функции, которую вы ищете в описании:

<?php
function duplicate(){
    $txt = strtolower("Love a and peace love a and peace love a and peace love a and peace love a and peace love a and peace");
    $strings = explode(" ",$txt);
    $set = 2 ;
    for($i=0;$i < sizeof($strings);$i++){
        $count = 0;
        $current = $strings[$i];
        for($j=$i+1;$j < sizeof($strings);$j++){
            if($strings[$j]!==$current){
                continue;
            }else if($count<$set){
                $count++;
            }else{
                echo ("String ".$current." repeated more than ".$set." timesn");
            }
        }
    }
}
echo("Hello World!n");
duplicate();
?>

Ответ 8

Я не уверен, что это хорошая идея для борьбы с такой проблемой. Если человек хочет ставить хлам в поле aboutme, они всегда придумают, как это сделать. Но я проигнорирую этот факт и борюсь с проблемой как алгоритмический вызов:

Наличие строки S, которая состоит из подстрок (которые могут появляться много раз и неперекрывающиеся) найти подстроку, в которую она состоит.

Определение – вошь, и я предполагаю, что строка уже преобразована в нижний регистр.

Сначала проще:


Используйте модификацию самой длинной общей подпоследовательности, которая имеет легкое решение для программирования DP. Но вместо того, чтобы найти подпоследовательность в двух разных последовательностях, вы можете найти самую длинную общую подпоследовательность строки относительно той же строки LCS(s, s).

В начале это звучит глупо (конечно LCS(s, s) == s), но на самом деле нас не волнует ответ, мы заботимся о DP-матрице, которую она получает.

Посмотрим на пример: s = "abcabcabc", а матрица:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 1, 0, 0, 1, 0, 0]
[0, 0, 2, 0, 0, 2, 0, 0, 2, 0]
[0, 0, 0, 3, 0, 0, 3, 0, 0, 3]
[0, 1, 0, 0, 4, 0, 0, 4, 0, 0]
[0, 0, 2, 0, 0, 5, 0, 0, 5, 0]
[0, 0, 0, 3, 0, 0, 6, 0, 0, 6]
[0, 1, 0, 0, 4, 0, 0, 7, 0, 0]
[0, 0, 2, 0, 0, 5, 0, 0, 8, 0]
[0, 0, 0, 3, 0, 0, 6, 0, 0, 9]

Обратите внимание на красивые диагонали. Как вы видите, первая диагональ заканчивается на 3, вторая с 6 и третья – с 9 (наше оригинальное решение DP, которое нам все равно).

Это не совпадение. Надеюсь, что, посмотрев более подробно о том, как построена матрица DP, вы можете видеть, что эти диагонали соответствуют повторяющимся строкам.

Вот пример для s = "aaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtas"
введите описание изображения здесь
и самая последняя строка в матрице:
[0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 17, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 51, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 68].

Как вы видите, большие числа (17, 34, 51, 68) соответствуют концу диагоналей (там также есть некоторый шум, потому что я специально добавил небольшие дубликаты букв, например aaa).

Что подсказывает, что мы можем просто найти gcd самых больших двух чисел gcd(68, 51) = 17, который будет длиной нашей повторяющейся подстроки.

Вот только потому, что мы знаем, что вся строка состоит из повторных подстрок, мы знаем, что она начинается с 0-й позиции (если мы этого не знаем, нам нужно будет найти смещение).

И вот мы идем: строка "aaabasdfwasfsdtas".

P.S. этот метод позволяет находить повторы, даже если они слегка изменены.

Для людей, которые хотели бы поиграть здесь, это python script (который был создан в сутолоке, поэтому не стесняйтесь улучшать):

def longest_common_substring(s1, s2):
    m = [[0] * (1 + len(s2)) for i in xrange(1 + len(s1))]
    longest, x_longest = 0, 0
    for x in xrange(1, 1 + len(s1)):
        for y in xrange(1, 1 + len(s2)):
            if s1[x - 1] == s2[y - 1]:
                m[x][y] = m[x - 1][y - 1] + 1
                if m[x][y] > longest:
                    longest = m[x][y]
            else:
                m[x][y] = 0
    return m

s = "aaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtas"
m = longest_common_substring(s, s)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
M = np.array(m)
print m[-1]
arr = np.asarray(M)
plt.imshow(arr, cmap = cm.Greys_r, interpolation='none')
plt.show()

Я рассказывал про легкий путь и забыл написать о трудном пути.
Уже поздно, поэтому я просто объясню эту идею. Реализация сложнее, и я не уверен, даст ли она вам лучшие результаты. Но вот он:

Используйте алгоритм самая длинная повторяющаяся подстрока (вам нужно будет реализовать trie или дерево суффикса, что не так просто в php).

После этого:

s = "aaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtas"
s1 = largest_substring_algo1(s)

Взял здесь most_substring_algo1. На самом деле это не самое лучшее (просто для показа идеи), поскольку оно не использует вышеупомянутые структуры данных. Результаты для s и s1:

aaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtas
aaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtasaa

Как вы видите, разница между ними на самом деле является подстрокой, которая была дублирована.

Ответ 9

У вас есть сложная проблема на ваших руках, прежде всего потому, что ваши требования несколько неясны.

Вы указываете, что хотите запретить повторный текст, потому что это “плохо”.

Подумайте о том, кто ставит последнюю строфу Роберта Мороза, останавливающуюся Вудсом на Снежном Вечере в их профиле:

These woods are lovely, dark and deep
but I have promises to keep
and miles to go before I sleep
and miles to go before I sleep

Вы можете считать это хорошим, но у него есть повторение. Так что хорошего, и что плохого? (обратите внимание, что это еще не проблема реализации, вы просто ищете способ определения “плохих повторений” )

Непосредственное обнаружение дубликатов, таким образом, оказывается сложным. Поэтому давайте перейдем к трюкам.

Сжатие работает, беря избыточные данные и сжимая его во что-то меньшее. Очень повторяющийся текст будет очень легко сжат. Трюк, который вы могли бы выполнить, – это взять текст, застегнуть его и посмотреть на коэффициент сжатия. Затем настройте разрешенное отношение к тому, что вы считаете приемлемым.

реализация:

$THRESHOLD = ???;
$bio = ???;
$zippedbio = gzencode($bio);
$compression_ratio = strlen($zippedbio) / strlen($bio);
if ($compression_ratio >= $THRESHOLD) {
  //ok;
} else {
  //not ok;
}

Несколько экспериментальных результатов из примеров, найденных в этом вопросе/ответах:

  • “Любовь и мир любить и мир любить и мир любить и мир любить и мир любить и мир”: 0.3960396039604
  • “Эти леса прекрасные, темные и глубокие
    но у меня есть promises, чтобы
    и мили, чтобы идти, прежде чем я сплю
    и мили, чтобы идти, прежде чем я сплю “: 0.78461538461538
  • “aaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtasaaabasdfwasfsdtas”: 0.58823529411765

предложите пороговое значение около 0,6, прежде чем отклонить его как слишком повторяющееся.

HotReboot

307 / 207 / 87

Регистрация: 22.04.2017

Сообщений: 1,031

1

12.01.2022, 19:58. Показов 248. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте. Не подскажете почему

PHP
1
strpos("example", "example");

есть false?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

12.01.2022, 19:58

Ответы с готовыми решениями:

Две одинаковые строки не распознаются, как одинаковые. Такое возможно? Скриншот дебага прилагается.
Пишу программу, начал тестировать, проходить всё пошагово (пишущийся в данный момент функционал). В…

Ввести 2 строки с клавиатуры. Определить, одинаковые ли строки без учета регистра, пробелов и знаков препинания
Ввести 2 строки с клавиатуры. Определить одинаковые ли строки без учета регистра,
пробелов и…

Найти одинаковые элементы первой строки, максимум соответствующих элементов второй строки, сократив матрицу
Здравствуйте!

Есть матрица,в которой нужно найти одинаковые элементы первой строки,после найти…

strpos()
Пробовал написать функцию для проверки есть ли в названии папки &quot;.&quot;. Проверка происходит через…

3

Эксперт PHP

3827 / 3178 / 1334

Регистрация: 01.08.2012

Сообщений: 10,768

12.01.2022, 20:44

2

Именно false? Покажите, как проверяете. Должно быть int 0.



0



HotReboot

307 / 207 / 87

Регистрация: 22.04.2017

Сообщений: 1,031

12.01.2022, 20:57

 [ТС]

3

Jodah,

PHP
1
2
3
$pos = strpos("example", "example");
if ($pos) ...
else ...



0



Эксперт PHP

3827 / 3178 / 1334

Регистрация: 01.08.2012

Сообщений: 10,768

12.01.2022, 21:28

4

HotReboot, всё правильно, функция возвращает 0, т.е. нулевую позицию. Поэтому проверять надо на $pos !== false, об этом в документации написано на красном фоне:
https://www.php.net/manual/ru/function.strpos.php



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

12.01.2022, 21:28

Помогаю со студенческими работами здесь

Strpos и массив
Добрый день. В общем, нужно написать небольшой фильтр, но дело в том, что надо возвращение…

MySQL: strpos?
Здравствуйте, необходимо стало вести такой поиск по базе, чтобы в определённом столбце было…

Странная обработка StrPos
Привет. Не пойму почему происходит обработка if, если даже &quot;а&quot; равен NULL, судя по Watch List. И…

findBy с использованием strpos
Здравствуйте, не подскажете как можно получить запись из базы данных, в описании которой содержится…

Аналог функции strpos()
Всем привет.
Подскажите как можно заменить функцию php strpos?
Сейчас у меня так
function…

strpos, поиск подстроки
Здравствуйте, есть такая небольшая так сказать проблема с strpos и вот не знаю как решить..
Есть…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

4

Добавить комментарий