PDA

View Full Version : سوال: چطور میتوان کلمات تکراری در یک جمله فارسی را پیدا و آنها را از جمله حذف و سپس چاپ نمود؟



hamidhassas
چهارشنبه 26 آذر 1399, 11:38 صبح
چطور میتوان کلمات تکراری در یک جمله فارسی را پیدا و آنها را از جمله حذف و سپس چاپ نمود؟


اول میخوام کاری کنم که مقدار ورودی که از دیتابیس صدا میزنم به ازای هر 3 فاصله بین کلمات یک جمله بیاد علامت , بزاره



$value="من می خواهم,کلمات تکراری را,یک جمله را,پیدا نموده و,کلمات تکراری را,از جمله حذف,کنم";


بعد میخوام جلمه های سه کلمه ای که ایجاد میشن به واسطه کارکتر , بررسی و جملات تکراری حذف کنم مثل زیر بشه


"من می خواهم,کلمات تکراری را,یک جمله را,پیدا نموده و,کلمات تکراری را,از جمله حذف,کنم";



یا اینکه وقتی من اطلاعات از دیتابیس صدا میزنم و هر جا در جمله فاصله وجود داشت اونها رو با کارکتر , تغییر میدم مانند زیر

مقدار


$value="من می خواهم کلمات تکراری در یک جمله را پیدا نموده و کلمات تکراری را از جمله حذف کنم";

کد


$rpl=str_replace(' ',',',$value);


نتیجه


$rpl_value="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم";



بعدش میخوام کاری کنم که مقدار rpl_value به صورت زیر نمایش داده بشه


$exit="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,از,ح ف,کنم";

roxment
چهارشنبه 26 آذر 1399, 13:03 عصر
$Data="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم"
;$DataEx=explode(',',$Data);
$FilterArr=array();$NewData='';for($x=0; $x<=count($DataEx)-1; $x++){
if (!in_array($DataEx[$x], $FilterArr)) { array_push($FilterArr, $DataEx[$x]); $Ch=''; if($x!=0){ $Ch=','; } $NewData=$NewData.$Ch.$DataEx[$x]; }}var_dump($NewData);

plague
پنج شنبه 27 آذر 1399, 14:17 عصر
$rpl_value="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم";
$rpl_array = explode(',' , $rpl_value);
$stack = [] ;
foreach( $rpl_array as $k=>$v )
{

if(in_array($v , $stack))
{
unset($rpl_array[$k]);
continue ;
}

$stack[] = $v ;

}

echo $result = implode(',' , $rpl_array) ;

hamidhassas
شنبه 29 آذر 1399, 09:16 صبح
تشکر کار میکنه


$Data="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم";

$DataEx=explode(',',$Data);

$FilterArr=array();

$NewData='';

for($x=0; $x<=count($DataEx)-1; $x++)

{

if (!in_array($DataEx[$x], $FilterArr))

{

array_push($FilterArr, $DataEx[$x]);

$Ch='';

if($x!=0)

{

$Ch=',';

}

echo $result=$NewData.$Ch.$DataEx[$x]; }

}

تشکر درست کار میکنه فقط یک سوال الان گفتم که متغیر result را بیاد و شروع کنه کارکتر , به فاصله عوض کنه و جالا چطوری میتونم بگم که بعدش بیاد بشماره هر 4 فاصله ای که شمرد در پنجمی یک کارکتر , بزاره یعنی اینجوری بشه






$result="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم";

$value=str_replace(',',' ',$result);


نتیجه



$exit="من می خواهم کلمات تکراری,در یک جمله را پیدا,نموده و کلمات تکراری را,از جمله حذف کنم";

hamidhassas
شنبه 29 آذر 1399, 09:22 صبح
$rpl_value="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم";

$rpl_array = explode(',' , $rpl_value);

$stack = [] ;

foreach($rpl_array as $k=>$v)

{

if(in_array($v , $stack))

{

unset($rpl_array[$k]);

continue ;

}

$stack[] = $v ;

}

$result = implode(',' , $rpl_array);



تشکر درست کار میکنه فقط یک سوال الان گفتم که متغیر result را بیاد و شروع کنه کارکتر , به فاصله عوض کنه و جالا چطوری میتونم بگم که بعدش بیاد بشماره هر 4 فاصله ای که شمرد در پنجمی یک کارکتر , بزاره یعنی اینجوری بشه


$result="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم";
$value=str_replace(',',' ',$result);



نتیجه



$exit="من می خواهم کلمات تکراری,در یک جمله را پیدا,نموده و کلمات تکراری را,از جمله حذف کنم";

plague
شنبه 29 آذر 1399, 13:55 عصر
این یه روش کم کد تر




$rpl_value="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم";
$stack = [] ;
$output = '' ;
foreach( explode(',' , $rpl_value ) as $k=>$v )
{
if(in_array($v , $stack))
continue ;

$stack[] = $v ;
$output .= count($stack) % 4 == 0 ? "$v," : "$v " ;

}


echo $output ;

plague
شنبه 29 آذر 1399, 14:07 عصر
.........................

plague
شنبه 29 آذر 1399, 14:08 عصر
$Data="من,می,خواهم,کلمات,تکرار� �,در,یک,جمله,را,پیدا,نموده,و ,� �لمات,تکراری,را,از,جمله,حذف ,� �نم"
;$DataEx=explode(',',$Data);
$FilterArr=array();$NewData='';for($x=0; $x<=count($DataEx)-1; $x++){
if (!in_array($DataEx[$x], $FilterArr)) { array_push($FilterArr, $DataEx[$x]); $Ch=''; if($x!=0){ $Ch=','; } $NewData=$NewData.$Ch.$DataEx[$x]; }}var_dump($NewData);

البته جسارت نباشه دوست عزیز ولی یه نکته رو میخام بهتون بگم که من مدتها پیش متوجه شدم با وجد سادگی توی کد های طولانی خیلی خوانایی رو بهتر میکنه

وقتی شرطی میخای بنویسی که یک حالتش نامطلوب داره (یعنی حالتی که در صورت وجودش نمیخای عملیات انجام بشه )
اول حالت منفی / نامطلوب رو چک کن و در صورت وجودش عملیات رو قطع کن
اینجوری دیگه برای حالت مطلوب نیاز نیست اسکوپ بزاری که باعث میشه پیچیدگی کد خیلی کمتر بشه


مثلا بجای




if( $ok )
{
//do stuff
}
else
{
exit("error");
}



میتونی بنویسی




if( !$ok )
exit("error");


//do stuff


حالا با همین قاعده کد شما




for($x=0; $x<=count($DataEx)-1; $x++)
{
if (!in_array($DataEx[$x], $FilterArr))
{
//do stuff
}
}




میتونه اینجوری نوشته بشه



for($x=0; $x<=count($DataEx)-1; $x++)
{
if (in_array($DataEx[$x], $FilterArr))
continue ;

//do stuff

}

roxment
شنبه 29 آذر 1399, 16:09 عصر
$Data="من,می,خواهم,کلمات,تکرار� �,در,یک,جمله,را,پیدا,نموده,و ,� �لمات,تکراری,را,از,جمله,حذف ,� �نم"
;$DataEx=explode(',',$Data);
$FilterArr=array();$NewData='';for($x=0; $x<=count($DataEx)-1; $x++){
if (!in_array($DataEx[$x], $FilterArr)) { array_push($FilterArr, $DataEx[$x]); $Ch=''; if($x!=0){ $Ch=','; } $NewData=$NewData.$Ch.$DataEx[$x]; }}var_dump($NewData);

البته جسارت نباشه دوست عزیز ولی یه نکته رو میخام بهتون بگم که من مدتها پیش متوجه شدم با وجد سادگی توی کد های طولانی خیلی خوانایی رو بهتر میکنه

وقتی شرطی میخای بنویسی که یک حالتش نامطلوب داره (یعنی حالتی که در صورت وجودش نمیخای عملیات انجام بشه )
اول حالت منفی / نامطلوب رو چک کن و در صورت وجودش عملیات رو قطع کن
اینجوری دیگه برای حالت مطلوب نیاز نیست اسکوپ بزاری که باعث میشه پیچیدگی کد خیلی کمتر بشه


مثلا بجای




if( $ok )
{
//do stuff
}
else
{
exit("error");
}



میتونی بنویسی




if( !$ok )
exit("error");


//do stuff


حالا با همین قاعده کد شما




for($x=0; $x<=count($DataEx)-1; $x++)
{
if (!in_array($DataEx[$x], $FilterArr))
{
//do stuff
}
}




میتونه اینجوری نوشته بشه



for($x=0; $x<=count($DataEx)-1; $x++)
{
if (in_array($DataEx[$x], $FilterArr))
continue ;

//do stuff

}

فرمایش شما کاملا درست هست اما متسفانه طی سال های اخیر همیشه پروژه های من در فشار زمانی بوده و همچنین اکثر اوقات انفرادی و عادت کردم به این سبک کد نویسی ولی صحبت شما صحیح است چون در کار تیمی باعث ایجاد مشکل می شود کلا یک برنامه نویس همیشه باید در حال اپدیت و برطرف کردن عادات بد خود باشد

hamidhassas
دوشنبه 08 دی 1399, 09:08 صبح
تشکر درست کار میکنه فقط یک سوال الان گفتم که متغیر result را بیاد و شروع کنه کارکتر , به فاصله عوض کنه و جالا چطوری میتونم بگم که بعدش بیاد بشماره هر 4 فاصله ای که شمرد در پنجمی یک کارکتر , بزاره یعنی اینجوری بشه


$result="من,می,خواهم,کلمات,تکراری,در, یک,جمله,را,پیدا,نموده,و,کلما ت,تکراری,را,از,جمله,حذف,کنم";
$value=str_replace(',',' ',$result);



نتیجه



$exit="من می خواهم کلمات تکراری,در یک جمله را پیدا,نموده و کلمات تکراری را,از جمله حذف کنم";