Проблем с array_unique и explode

maxaffey

Registered
Здравейте, пробвам с array-unique и explode да изкарам един текст от data.txt, който е на различен ред всеки и да ми го провери дали се повтаря и да ми изкара само уникалните текстове.

Ето кода

Код:
<?

$arr=file("data.txt");



    foreach($arr as $str)


    {

    list($name)=array_unique(explode("|",$str));


    echo "<br>".$name;


    }

 
?>

като в data.txt имам на различен ре димам съответно:

111
222
111

и трябва да ми изкара само:
111
222

но ми изписва:
111
222
111


Пробвах по всякакъв начин да ги въртя нещата, но ими не става ими ми дава някаква грешка!

Моля ако нямой може да помогне
 
Не работя с txt файлове и въобще ме няма там но ще ти предложа по логически начин ти ще го превърнеш в код евентуално

в data.txt да добавиш да имат по още 1 колоно напреимер id
и понякъкъв начин да сравниш стойноститте на $name чрез id и ако те съвпадат там където се повтаря да слага стойност $name="";
 
Защото във всяко въртене на цикъла ти пускаш array_unique, тоест ти не уеднаквяваш масив, ами уеднаквявам запис от масива.
 
eddyy93 каза:
Защото във всяко въртене на цикъла ти пускаш array_unique, тоест ти не уеднаквяваш масив, ами уеднаквявам запис от масива.

И как да го разделя, така ли:

Код:
<?

$arr=file("data.txt");



    foreach($arr as $str)


    {

    list($name)=explode("|",$str);


    echo "<br>".$name;


    }

$input = array($name);
$result = array_unique($input);
print_r($result);
?>

защото пак не се получава :o
 
значи на всеки ред или там квото правиш му задаваш уникално, но най горе преди foreach задаваш празен масив.

данните от всяко въртене ги вкарваш с тоя масив.

при всяко въртене на foreach правиш проверка дали всяки един резултат от всеки ред съществува в масива с in_array() и ако не съществува го добавяш с array_merge и ще стане много лесно
 
Ако текстовете ти се разделят с "|"

PHP:
<?php
	
$NewArr = array();

$Arr=file("data.txt");

$ArrExplode = explode("|", $Arr);

$NewArr = array_unique($ArrExplode);

foreach($NewArr as $str)
    {
    echo "<br>".$str;
    }


?>
 
eddyy93 каза:
Ако текстовете ти се разделят с "|"

PHP:
<?php
	
$NewArr = array();

$Arr=file("data.txt");

$ArrExplode = explode("|", $Arr);

$NewArr = array_unique($ArrExplode);

foreach($NewArr as $str)
    {
    echo "<br>".$str;
    }


?>

Нищо не се получава, излиза ми само "Array"
 
Защото file() връща масив .. Ползвай file_get_contents().

Или най - добре сложи информацията от този текстов файл тук, за да видим как е подредена и кажи точно крайният резултат който очакваш.
 
Еми след като file() връща масив не го минавай през explode. Изтрязкай един print_f на върнатия масив, виж как изглежда и според това го форматирай. Току виж array_unique започне да работи от първия път :D
 
PHP:
<?php
$NewArr = array();
$Arr=file("data.txt");
foreach ($Arr as $Arr2)
{
$Arr3 .= $Arr2;
}
$ArrExplode = explode("|", $Arr3);
$NewArr = array_unique($ArrExplode);
foreach($NewArr as $str)
{
echo "<br>".$str;
}
?>

Taka ?
 
file(); връща всеки нов ред от файла като нов запис в масива. При такъв случай, ако правилно записваш информацията във .txt файла, тоест на нов ред всеки запис, то тогава няма нужда от explode(); както каза TryMe.

Другия вариант е да ползваш file_get_contents(); той ти връща цялата информация в един стринг и следователно ако имаш разделител, ти ще успееш да разделиш информацията чрез explode();

Това което проба ти е пратил като код, всъщност действа като file_get_contents(); всички нови редове ги вкарва в един едноредов стринг и от там чрез explode(); само където пуска 1 безсмислен цикъл, вместо да се ползва готова функция.

Сега уточни пред себе си как ще записваш информацията:

- Ако има разделител ползвай file_get_contents();
- Ако е само на нов ред ползвай file();
 
скрипта на proba действа но само ми изкарва това, което прави и моя в началото.

Та пак да обясня:

имам текстовия файл data.txt в който всеки запис е записан на нов ред,
искам да взима всеки ред от файла и да ми го поставя в променлива, да ми сравни променливите и да ми показва само по един път тези, които се повтарят.

data.txt съдържание:
Код:
111
222
111

като стартирам скрипта променливите да вземат следните стойности:

$promenliva1 = 111;
$promenliva2 = 222;
$promenliva3 = 111;


и съответно на страницата да ми покаже:

111
222

или като види, че има съвпадение в $promenliva1 и $promenliva3 да ми показва еднаквия резултат само един път.
 
Във файла file.txt след края на информацията на някой ред ако има просто оставено едно празно място (по невнимание ако си натиснал space), тогава този запис ако има дубликат няма да го засече, всичко трябва да е строго подредено, тоест свършва информацията на реда и ведна нов ред, без никакви празни места и т.н., иначе array_unique няма да засече точно, все пак ако има едно празно място, тогава ще се промени съдържанието и ще се счита, че това е различен запис.

Ползвам file.txt

Код:
sometext 1
sometext 2
sometext 3
sometext 2
sometext 5

И другия файл:
PHP:
<?php
$NewArr = array();

$Arr = file('file.txt');

$NewArr = array_unique($Arr);

foreach($NewArr as $str)
    {
    echo "<br>".$str;
    }


?>
 
PHP:
<?php

$file = file("test.txt"); //111\n222\n111

$temp = array();
foreach($file as $f)
	$temp[] = trim($f); 
        //понеже първия 111 има бонус знака за нов ред \n той става стринг от 5 знака, а последното 111 си остава с 3 знака и за това ти ги отделя като различни
	
$uniques = array_unique($temp);

print_r($uniques);

?>

Дерзай народе :D
 
На TryMe ще работи примера, дори и да имаш празни места след редовете, само, че ще ползваш 2 цикъла, вместо един.

Искам да кажа ако смяташ, че информацията ще е записваш стриктно (имам предвид при вкарване на информацията във файла, като ползваш trim();), ползвай моя, ако смяташ, че може някъде да се добавя на ръка и да се сгреши, ползвай на TryMe.

Ама незнам ако се отваря този файл от някакъв текстов редактор и той вземе да си сложи празни места от зад, тогава ще е по - добре на TryMe :D

Ако смяташ този файл да не се отваря много често, тоест няма да играе кой знае каква роля ползвай неговия (щото ще се въртят 2 цикъла с неговия за това става дума), по - сигурен е. :?:
 
Да ти кажа един цикъл не го бърка, а ако го бърка може и така да направи:

PHP:
function trim_it(&$value)
{
        $value = trim($value);
}

array_walk($file, "trim_it");

print_r($file);
 
eddyy93 каза:
Във файла file.txt след края на информацията на някой ред ако има просто оставено едно празно място (по невнимание ако си натиснал space), тогава този запис ако има дубликат няма да го засече, всичко трябва да е строго подредено, тоест свършва информацията на реда и ведна нов ред, без никакви празни места и т.н., иначе array_unique няма да засече точно, все пак ако има едно празно място, тогава ще се промени съдържанието и ще се счита, че това е различен запис.

Ползвам file.txt

Код:
sometext 1
sometext 2
sometext 3
sometext 2
sometext 5

И другия файл:
PHP:
<?php
$NewArr = array();

$Arr = file('file.txt');

$NewArr = array_unique($Arr);

foreach($NewArr as $str)
    {
    echo "<br>".$str;
    }


?>

ДА така вече се получават перфектно нещата :?: , мерси eddyy93, само след последния ред с текст трябва да има празен ред, за да се получат нещата.

TryMe, на твоя код ми изкарва: Array ( [0] => 111 [1] => 222 )
 
maxaffey каза:
eddyy93 каза:
Във файла file.txt след края на информацията на някой ред ако има просто оставено едно празно място (по невнимание ако си натиснал space), тогава този запис ако има дубликат няма да го засече, всичко трябва да е строго подредено, тоест свършва информацията на реда и ведна нов ред, без никакви празни места и т.н., иначе array_unique няма да засече точно, все пак ако има едно празно място, тогава ще се промени съдържанието и ще се счита, че това е различен запис.

Ползвам file.txt

Код:
sometext 1
sometext 2
sometext 3
sometext 2
sometext 5

И другия файл:
PHP:
<?php
$NewArr = array();

$Arr = file('file.txt');

$NewArr = array_unique($Arr);

foreach($NewArr as $str)
    {
    echo "<br>".$str;
    }


?>

ДА така вече се получават перфектно нещата :?: , мерси eddyy93, само след последния ред с текст трябва да има празен ред, за да се получат нещата.

TryMe, на твоя код ми изкарва: Array ( [0] => 111 [1] => 222 )


Еми ще ти изкарва, не виждаш ли, че дебъгвам масива само и само да видиш резултата :D Направи си още един цикъл и воаля:

PHP:
<?php

$file = file("test.txt");

function trim_it(&$value){
       $value = trim($value);
}
array_walk($file, "trim_it");
$uniques = array_unique($file);

foreach($uniques as $f){
      echo $f . "<br />";
}

?>

Ето ти и другия вариант, като за мързеливи :D
 

Back
Горе