الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفيه استبعاد قيم الarray الفارغه و كيفيه حذف العلامات او المسافت الزائده

مغلقمُجاب
بدأه Waleed-KH في 11 فبراير 2013 · 9 رد · 2,468 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع



السلام عليكم و رحمه الله و بركاته
-----------------------

لو انا مثلا عندي array بالشكل دا

Array
(
    [0] => 
    [1] => a
    [2] => b
    [3] => 
    [4] => c
    [5] => 
    [6] => 
    [7] => d
    [8] => e
    [9] => f
    [10] => 
)

هل يوجد function يقم بتحويلها الي هذا الشكل
 
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)

و لو انا عندي مثلا مثغير بالشكل دا
 
 
$x = "         Hello                  World" ;

لو استخدمت الداله trim هيبصبح بهذا الشكل
 
 
$x = "Hello                  World" ;

ازاي اخليها تبقي بالشكل دا
 
 
$x = "Hello World" ;

و لو مثلا عندي متغير بهذا الشكل
 
 
$x = "These-------are////////a_____few,,,,,,,,,,,words" ;

ازاي احولو لهذا الشكل
 
 
$x = "These-are/a_few,words" ;

ارجو الاجابه و شكرا :)
#2

بالنسبة للسؤال الأول:

$array = array(
    0 => '',
    1 => 'a',
    2 => 'b',
    3 => '',
    4 => 'c',
    5 => '',
    6 => '',
    7 => 'd',
    8 => 'e',
    9 => 'f',
    10 => '');

foreach($array as $value){
	if($value != ''){
		echo $value."<br />";
	}
}


بالنسبة لباقي الأسئلة أعتقد انه عليك استعمال التعابير النظامية

#3 أفضل إجابة

بالنسبة للسؤال الأول فيمكنك إستخدام array_filter. عند تمرير مصفوفة فقط، بدون دالة، فستعيد نفس المصفوفة بدون العناصر الفارغة null:

<?php

$array = array(null, 'a', 'b', null, 'c', null, null, 'd', 'e', 'f',null);

header('Content-type: text/plain; charset=utf-8');

print_r($array);

print_r(array_filter($array));

?>

ستطبع:

Array
(
    [0] => 
    [1] => a
    [2] => b
    [3] => 
    [4] => c
    [5] => 
    [6] => 
    [7] => d
    [8] => e
    [9] => f
    [10] => 
)
Array
(
    [1] => a
    [2] => b
    [4] => c
    [7] => d
    [8] => e
    [9] => f
)

توجد عدة إستخدامات لها لتصفية المصفوفات أنصحك بالإطلاع عليها.

 

-- ولكن هذه قد تشكل لك مشكلة عندما تقوم مثلا بعمل for loop بواسطة الدالة count و قمت بالمرور على عناصر المصفوفة باستخدام معرف الحلقة وذلك ﻷن الدالة count سترجع 6 بينما عند محاولة المرور على عناصر المصفوفة ضمن الحلقة باستخدام معرف الحلقة فلن تمر على العنصر رقم 7 و العنصر رقم 8 و رقم 9.

 

لذلك استخدم الدالة array_filter دائما مع الدالة array_values بالشكل التالي:

print_r(array_values(array_filter($array)));

 

عندها ستطبع :

 

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

 

 

 

الثاني، إستبدل كل المسافات المكررة بمسافة واحدة وأزل المسافات التي في بداية ونهاية النصّ (بنص فارغ):

 

 

<?php

$x = "

Hello

        World


" ;

header('Content-type: text/plain; charset=utf-8');

$x = preg_replace('#^\s+|\s+$#', '', $x);
$x = preg_replace('#\s+#', ' ', $x);

var_dump($x);

?>

 

سيطبع:

 

string(11) "Hello World"

 

 

الثالث، أعتقد أنك فقط تريد إزالة الحروف المكررة؟ إذا أتاك حروف والذي ياليه (حرف فأكثر) متشابهان، إستبدل نفس الحرف بنفسه:

 

<?php

$x = "These-------are////////a_____few,,,,,,,,,,,words" ;

header('Content-type: text/plain; charset=utf-8');

$x = preg_replace('#(.)(\1+)#', '\1', $x);

var_dump($x);

?>

 

سيطبع:

 

string(21) "These-are/a_few,words"

 

بالتوفيق

تم تعديل هذه المشاركة بواسطة MoHaMMaD Pro في 11 فبراير 2013 في 22:21 — السبب: اضافة فكرة مهمة

3
#4
Mr.B كتب:

بالنسبة للسؤال الأول فيمكنك إستخدام array_filter. عند تمرير مصفوفة فقط، بدون دالة، فستعيد نفس المصفوفة بدون العناصر الفارغة null:

<?php

$array = array(null, 'a', 'b', null, 'c', null, null, 'd', 'e', 'f',null);

header('Content-type: text/plain; charset=utf-8');

print_r($array);

print_r(array_filter($array));

?>
ستطبع:
Array
(
    [0] => 
    [1] => a
    [2] => b
    [3] => 
    [4] => c
    [5] => 
    [6] => 
    [7] => d
    [8] => e
    [9] => f
    [10] => 
)
Array
(
    [1] => a
    [2] => b
    [4] => c
    [7] => d
    [8] => e
    [9] => f
)
توجد عدة إستخدامات لها لتصفية المصفوفات أنصحك بالإطلاع عليها.

 

الثاني، إستبدل كل المسافات المكررة بمسافة واحدة وأزل المسافات التي في بداية ونهاية النصّ (بنص فارغ):

 

 

<?php

$x = "

Hello

        World


" ;

header('Content-type: text/plain; charset=utf-8');

$x = preg_replace('#^\s+|\s+$#', '', $x);
$x = preg_replace('#\s+#', ' ', $x);

var_dump($x);

?>
 

سيطبع:

 

string(11) "Hello World"
 

 

الثالث، أعتقد أنك فقط تريد إزالة الحروف المكررة؟ إذا أتاك حروف والذي ياليه (حرف فأكثر) متشابهان، إستبدل نفس الحرف بنفسه:

 

<?php

$x = "These-------are////////a_____few,,,,,,,,,,,words" ;

header('Content-type: text/plain; charset=utf-8');

$x = preg_replace('#(.)(\1+)#', '\1', $x);

var_dump($x);

?>
 

سيطبع:

 

string(21) "These-are/a_few,words"
 

بالتوفيق

 

 

 

متشكر اوووووووووووووووووي علي المساعده

هل ممكن ان تشرح لي كيف تعمل preg_replace

و ما معني هذا الكود

 

 

$x = preg_replace('#^\s+|\s+$#', '', $x);
$x = preg_replace('#\s+#', ' ', $x);
$x = preg_replace('#(.)(\1+)#', '\1', $x);

تم تعديل هذه المشاركة بواسطة Waleed-KH في 11 فبراير 2013 في 17:58

#5

الـ preg_repalce شبيهة بالـ str_replace إلا أنها تعمل باستخدام الـ regex - regular expression - pattern

فمثلا هذه:

$x = preg_replace('#^\s+|\s+$#', '', $x);

تعني ابحث عن الفراغات الموجود في بداية أو نهاية السلسلة النصية واستبدلها بلا شيء, بمعنى ازلها.

حيث أن هذا التركيب:

^\s+

سيتطابق مع كل فراغ أو أكثر موجود في بداية السلسلة النصية حيث أن ^ في هذا التركيب تمثل بداية السلسلة النصية, و الـ \s تمثل الفراغ whitespace و الـ + تمثل التكرار لمرة واحدة أو أكثر

و الـ pipe "|" تعني "أو"

وبقية التركيب:

\s+$

سيتطابق مع كل فراغ او أكثر موجود في نهاية السلسلة النصية, حيث أن المحرف $ يمثل نهاية السلسلة!

 

وبنفس الأسلوب ستجد أن هذه:

$x = preg_replace('#\s+#', ' ', $x);

تعني ابحث عن أي فراغ أو أكثر من السلسلة أينما كان و قم باستبداله بفراغ واحد فقط

وهذه:

$x = preg_replace('#(.)(\1+)#', '\1', $x);

هنا النقطة "." تمثل محرف واحد (أي محرف), والـ \1 لا أدري كيف اعبر لك عنها بالعربية ولكنها تعني first remembered pattern يعني أنها تمثل هنا المحرف الذي تمثله النقطة و الـ + كما تم شرحها سابقاً تكرار لمرة واحد على الأقل أو أكثر

بالتالي هذه ستقوم بمطابقة المحارف المتكررة بشكل متتابع و تقوم باستبدالها بذات المحرف ولكن بدون تكرار

 

لنقل مثلا أن النقطة ستقابل الحرف T الموجود في السلسلة النصية بالتالي التركيب لن يتطابق ﻷن المحرف الذي يلي النقطة ليس T أيضاً فهذا التركيب سيبحث فقط عن الأحرف المتكررة بشكل متتابع

فالتركيب سيتطابق فقط عند محرف - و محرف / و محرف _ و محرف , ﻷنها جاءت متكررة بشكل متتابع ضمن السلسلة. وسيقوم باستبدالها بمحرف واحد لكل منها

 

بتوفيق الله..

1

Everything will be fine when we TALK LESS, DO MORE


#6

مرحبا ً عزيزي ,

اولا كما قال الاخوان استخدم دالة

 

array_filter

لكي تزيل القيم الفارغة من المصفوفة .

 

ثانياً , بخصوص المشاكل الاخرى كلهاً , كما قال الاخوان يمكن استخدام تعابير خاصة لازالة ما تريد وللعلم فقط regural expressions لها استخدامات كثيرة ودورها مهم جداً الا انك تحتاج وقتاً لكي تفهم اساسياتها و معانيها , لكي تستطيع بعد ذلك تأليف التعابير الخاصة بك حسب المشكلة التي تواجهك.

 

لذلك اقترح عليك استخدام ابسط واسرع الطرق للتفكير في حل للمشكلة , وهي استخدام دالة

 

str_replace

وهي تستخدم لاستبدال نص معين

مثال/

$x = "         

Hello          

        World


" ;

$x=trim(str_replace("  "," ",$x));

كما تلاحظ , استخدمنا دالة str_replace لاستبدال المسافتان بمسافة واحدة , قد يكون لدينا مسافة بادئة او في النهاية ولذلك استخدمنا دالة trim لاستئصال الزيادات

الامر نفسه ينطبق على كل المشاكل الاخرى .

 

ولك جزيل الشكر

=============
الطموح و الحافز سر النجاح

=============

AflamHQ.com | Palphp.com

#7
Hamdan Taima كتب:
$x=trim(str_replace("  "," ",$x));

 

هذه لن تعمل بالشكل المطلوب بالحالة العامة, فماذا لو كان عدد الفراغات بين الكلمات أكثر من فراغين أو بعدد فردي مثلا؟ وليكن 3 فراغات, سيتم تحويلها إلى فراغين وليس فراغ واحد.

Everything will be fine when we TALK LESS, DO MORE


#8
MoHaMMaD Pro كتب:

الـ preg_repalce شبيهة بالـ str_replace إلا أنها تعمل باستخدام الـ regex - regular expression - pattern

فمثلا هذه:

$x = preg_replace('#^\s+|\s+$#', '', $x);

تعني ابحث عن الفراغات الموجود في بداية أو نهاية السلسلة النصية واستبدلها بلا شيء, بمعنى ازلها.

حيث أن هذا التركيب:

^\s+

سيتطابق مع كل فراغ أو أكثر موجود في بداية السلسلة النصية حيث أن ^ في هذا التركيب تمثل بداية السلسلة النصية, و الـ \s تمثل الفراغ whitespace و الـ + تمثل التكرار لمرة واحدة أو أكثر

و الـ pipe "|" تعني "أو"

وبقية التركيب:

\s+$

سيتطابق مع كل فراغ او أكثر موجود في نهاية السلسلة النصية, حيث أن المحرف $ يمثل نهاية السلسلة!

 

وبنفس الأسلوب ستجد أن هذه:

$x = preg_replace('#\s+#', ' ', $x);

تعني ابحث عن أي فراغ أو أكثر من السلسلة أينما كان و قم باستبداله بفراغ واحد فقط

وهذه:

$x = preg_replace('#(.)(\1+)#', '\1', $x);

هنا النقطة "." تمثل محرف واحد (أي محرف), والـ \1 لا أدري كيف اعبر لك عنها بالعربية ولكنها تعني first remembered pattern يعني أنها تمثل هنا المحرف الذي تمثله النقطة و الـ + كما تم شرحها سابقاً تكرار لمرة واحد على الأقل أو أكثر

بالتالي هذه ستقوم بمطابقة المحارف المتكررة بشكل متتابع و تقوم باستبدالها بذات المحرف ولكن بدون تكرار

 

لنقل مثلا أن النقطة ستقابل الحرف T الموجود في السلسلة النصية بالتالي التركيب لن يتطابق ﻷن المحرف الذي يلي النقطة ليس T أيضاً فهذا التركيب سيبحث فقط عن الأحرف المتكررة بشكل متتابع

فالتركيب سيتطابق فقط عند محرف - و محرف / و محرف _ و محرف , ﻷنها جاءت متكررة بشكل متتابع ضمن السلسلة. وسيقوم باستبدالها بمحرف واحد لكل منها

 

بتوفيق الله..

مشكوووووووووووووووور جدااااااااااااااا علي هذا الشرح

معلش سؤال اخير

في المتغير

$x = "These-------are////////a_____few,,,,,,,,,,,wooords" ;

اذا استخدمت الداله

$x = preg_replace('#(.)(\1+)#', '\1', $x);

سيصبح بهذا الشكل

$x = "These-are/a_few,words";

انا اريده ان يلغي التكرار في العلامات / . - _ , فقط

بحيث يصبح بهذا الشكل

$x = "These-are/a_few,wooords";
#9

استخدم هذه:

$x = preg_replace('#([-_/,])(\1+)#', '\1', $x);

Everything will be fine when we TALK LESS, DO MORE


#10

بعد اذن الأخ Mr.B قمت بالتعديل على اجابته كونها أفضل اجابة لإضافة فكرة مهمة إليها لمن قد يحتاج مراجعة الموضوع مستقبلاً

Everything will be fine when we TALK LESS, DO MORE


هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…