محاكاة دوال PHP
بسم الله الرحمن الرحيم
الحمدلله، والصلاة والسلام على خير خلق الله، سيدنا محمد، وعلى آله وصحبه ومن والاه، وبعد؛
إخوتي روّاد قسم PHP ، أود أن أطرح فكرة بسيطة وجميلة في نفس الوقت، تفيد المبتدئين في فهم اللغة، وكذلك تقوّي المتمكنين على كتابة أكواد الـ PHP المتعمقة في اللغة ..
الفكرة في محاكاة دوال الـ PHP الموجودة في بنية اللغة Built In .. أي أننا نطرح اسم الدالة ونعيد كتابة وظيفتها كاملة ..
وكي تتضح الفكرة أكثر لمن لم يفهمها .. سنطرح مثلاً تعبير echo فيكون المحاكي له:
كود PHP:
function echo_sim ( $var ) { print $var ; }
طبعاً الفكرة ليست في هذه الدوال البسيطة لكن هذا حتى يتضح ما أقصده بالـ " محاكاة " .. أي إعادة كتابة وظيفة الدالة من الصفر ..
دعونا نبدأ بدالة دالة وستكون آلية العمل أن يطرح أحدنا اسم دالة ونقوم جميعاً بمحاكاتها ، وتعديل الأكواد جماعياً هنا حتى نصل إلى دالة تعمل عمل الدالة الأصلية 100٪ .. ونتفق على ذلك، ثم نطرح اسم دالة أخرى لنحاكيها معاً مرة أخرى ..
أي أننا لن ننتقل إلى دالة أخرى إلا بعد أن نتفق على محاكاة الدالة السابقة، لأغراض التنظيم ..
أتمنى الالتزام في إطار الموضوع .. وبجدية النقاش والكتابة والتنظيم ..
سنبدأ بمحاكاة دالة بسيطة وهي
trim ، طبعاً وظيفة الدالة بشكل عام إزالة الفراغات البيضاء من بداية ونهاية البيانات النصية ..
http://www.php.net/trim
المطلوب إتمام الوظيفة كاملة كما تنفذها الدالة ..
تحياتي، أشرف السمهوري
23-05-2009, 08:54 PM
عضو مميز
#2
trim لها وظيفة اخري
فهل تريد فقط حذف الفراغات ؟
24-05-2009, 02:41 AM
فكرة جميلة ..
ممكن بهذا الشكل؟
كود PHP:
function _trim ( $input , $charlist = '' ){ return preg_replace ( "/^[\s$charlist]+/is" , '' , preg_replace ( "/[\s$charlist]+$/is" , '' , $input )); } $output = _trim ( ' Hello world ' ); var_dump ( $output ); echo "\n" ; $output = _trim ( ' Hello world ' , 'hd' ); var_dump ( $output ); echo "\n" ; // trim() doesn't support arrays $output = _trim (array( ' Hello world ' , ' Hello world ' )); var_dump ( $output );
__________________ محمد حمود.
24-05-2009, 05:17 AM
الدالة السابقة تحذف الرموز الغير مطبوعة أيضا لكن trim لا تحذفها
تعديل
كود PHP:
function _trim ( $input , $charlist = '' ){ return preg_replace ( "/^[ \t\r\n\\0\x0B$charlist]+/i" , '' , preg_replace ( "/[ \t\r\n\\0\x0B$charlist]+$/i" , '' , $input )); }
ولدعم utf-8
كود PHP:
function _trim ( $input , $charlist = '' ){ return preg_replace ( "/^[ \t\r\n\\0\x0B$charlist]+/iu" , '' , preg_replace ( "/[ \t\r\n\\0\x0B$charlist]+$/iu" , '' , $input )); }
__________________ محمد حمود.
آخر تعديل بواسطة mr_m في 24-05-2009 الساعة 06:22 AM .
24-05-2009, 06:13 AM
المجروح، المقصود إتمام وظيفة الدالة بشكل تام كما هي في المانيوال ..لذلك وضعت رابط الصفحة من المانيوال ..
mr_m، ممتاز جداً .. أعتقد أن الدالة التي كتبتها ستتم وظيفة trim على أكمل وجه ، هل بقي شيء؟
أعتقد أننا أتممنا دالة trim هكذا .. ما رأيكم أن ننتقل إلى دالة
implode ؟
أنتظر محاولاتكم في دالة implode وسأعود لأحاول في تطويرها معكم إن شاء الله ..
تحياتي، أشرف السمهوري
24-05-2009, 09:55 AM
إقتباس:
المشاركة الأصلية بواسطة
أشرف السمهوري المجروح، المقصود إتمام وظيفة الدالة بشكل تام كما هي في المانيوال ..لذلك وضعت رابط الصفحة من المانيوال ..
mr_m، ممتاز جداً .. أعتقد أن الدالة التي كتبتها ستتم وظيفة trim على أكمل وجه ، هل بقي شيء؟
أعتقد أننا أتممنا دالة trim هكذا .. ما رأيكم أن ننتقل إلى دالة implode ؟
أنتظر محاولاتكم في دالة implode وسأعود لأحاول في تطويرها معكم إن شاء الله ..
تحياتي، أشرف السمهوري
محاولة سريعة ولكنها لا تنفع الا مع الدوال الرقمية
كود PHP:
function implode_fun ( $statement , $array ){
$i = 0 ;
$return = "" ;
while( $i < count ( $array )){
if(( $i + 1 ) != count ( $array )){
$return .= $array [ $i ]. "$statement" ;
}
else{
$return .= $array [ $i ];
}
$i ++;
}
return $return ;
}
$varss =array( 6 , 2 , 5 , 8 , 6 , 9 , 9 , 6 , 6 , 66 , 6 );
echo implode_fun ( "," , $varss );
24-05-2009, 11:16 AM
كود PHP:
function implode_sim ( $string , $array ) { $str = '' ; foreach( $array as $key => $value ) { $str .= $value ; ( next ( $array )!= null ) ? $str .= $string : '' ; } return $str ; }
__________________
لا إله الا الله محمد رسول الله فضائية الأقصى :: عينك على الوطن نيلسات: 10872 عمودي 27500
عربسات: 12054 عمودي 27500
إعلامنا.. إسلامي.. هادف.. مقاوم.. لتعلو الراية..
24-05-2009, 11:31 AM
إقتباس:
المشاركة الأصلية بواسطة
MPHP كود PHP:
function implode_sim ( $string , $array ) {
$str = '' ;
foreach( $array as $key => $value ) {
$str .= $value ;
( next ( $array )!= null ) ? $str .= $string : '' ;
}
return $str ;
}
جميل لم افكر بذه الطريقة انا عملت واحدة ولكن بها مشكلة اذا عنصر قيمته نفس العنصر الاخير لا يطبع الاشارة
ها هي
كود PHP:
function implode2 ( $array , $statement ){
$return = "" ;
end ( $array );
$current = current ( $array );
foreach( $array as $arr ){
if( $arr != $current ){
$return .= $arr . $statement ;
}
else{
$return .= $arr ;
}
}
return $return ;
}
24-05-2009, 11:53 AM
إعمل المقارنة على key وليس على value
بيمشي الحال
__________________
لا إله الا الله محمد رسول الله فضائية الأقصى :: عينك على الوطن نيلسات: 10872 عمودي 27500
عربسات: 12054 عمودي 27500
إعلامنا.. إسلامي.. هادف.. مقاوم.. لتعلو الراية..
24-05-2009, 12:01 PM
كود PHP:
function _implode ( $glue , $pieces = null ){ if(! $pieces ){ $pieces = $glue ; unset( $glue ); } if(! is_array ( $pieces )) return; $output = current ( $pieces ); while( false !== ( $next = next ( $pieces ))) $output .= $glue . $next ; return $output ; } $arr = array( 'h' , 'e' , 'l' , 'l' , 'o' ); var_dump ( _implode ( '-' , $arr )); echo "\n" ; var_dump ( _implode ( $arr ));
- ابتداء من 4.3.0 صار من الممكن ان تقبل implode العنصر الاول كمصفوفة وفي هذه الحالة تقوم بلصقها وارجاعها
- في حالة عدم ادخال مصفوفة ترجع الدالة null + رسالة خطأ
- حاولت ضغط الدالة السابقة لكن اعتقد ان هناك عدة طرق افضل
باذن الله لي عودة مع محاولة جديدة ان لم تكونوا انتقلتم لدالة اخرى.
__________________ محمد حمود.
24-05-2009, 12:13 PM
إقتباس:
المشاركة الأصلية بواسطة
MPHP إعمل المقارنة على key وليس على value
بيمشي الحال
نعم انا تذكرت ذلك بعد ما شفت دالتك والموضوع لتبادل الخبرات مرة تصيب مرة تخيب
24-05-2009, 12:14 PM
جميع الأكواد جميلة .. شكراً لمشاركاتكم .. ما رأيكم بمشاركتي؟ وكيف يمكننا أن ندمج جميع الأفكار لنصل إلى الدالة المثالية؟
كود PHP:
function implode_sim ( $para1 , $para2 = '' ) { $pieces = ( is_array ( $para1 ) ? $para1 : ( is_array ( $para2 ) ? $para2 : null )); if ( $pieces === null ) return false ; $glue = (! is_array ( $para1 ) ? $para1 : $para2 ); $pieces = array_values ( $pieces ); $count = count ( $pieces ); for ( $i = 0 ; $i < $count ; $i ++) { $ret .= $pieces [ $i ] . (isset( $pieces [ $i + 1 ]) ? $glue : '' ); } return $ret ; }
أعدت كتابة الكود كاملاً بطريقتي وأضفت ميزة تبديل الباراميترين .. حيث أن دالة implode بخلاف explode تقبل تبديل الباراميترات ، فيمكن تمرير الفاصل أولاً ثم المصفوفة، أو العكس، وكذلك يمكن تمرير مصفوفة وحدها لذلك جعلت الباراميتر الثاني اختيارياً ..
تحياتي، أشرف السمهوري
24-05-2009, 02:07 PM
اوكي، سننتقل إلى دالة strtoupper وطبعاً strtolower بما أنهما متعاكستان في الوظيفة ..
سوف نركّز على حروف اللغة الإنجليزية في عملية تحويل حالة الحروف، ولا أدري إن كان أحد يرغب في زيادة الوظيف لتدعم الـ locale مهما كان ..
تحياتي، أشرف السمهوري
24-05-2009, 03:44 PM
بالإعتماد على الآسكي
كود PHP:
function strtoupper_sim ( $text ) { $txt = '' ; for( $i = 0 ; $i < strlen ( $text ); $i ++) { if( ord ( $text [ $i ])>= 97 and ord ( $text [ $i ])<= 122 ) { $txt .= chr ( ord ( $text [ $i ])- 32 ); } else { $txt .= $text [ $i ]; } } return $txt ; }
كود PHP:
function strtolower_sim ( $text ) { $txt = '' ; for( $i = 0 ; $i < strlen ( $text ); $i ++) { if( ord ( $text [ $i ])>= 65 and ord ( $text [ $i ])<= 90 ) { $txt .= chr ( ord ( $text [ $i ])+ 32 ); } else { $txt .= $text [ $i ]; } } return $txt ; }
__________________
لا إله الا الله محمد رسول الله فضائية الأقصى :: عينك على الوطن نيلسات: 10872 عمودي 27500
عربسات: 12054 عمودي 27500
إعلامنا.. إسلامي.. هادف.. مقاوم.. لتعلو الراية..
24-05-2009, 04:28 PM
رائع أستاذ MPHP هذا الحل اللي كنت أنتظره
...
كنت متوقع أول حل أشوفه مصفوفتين للحروف وعملية استبدال، بس تمام الوضع هيك هههه
منتظر تعليقات الأعضاء أولاً بعدين ننتقل لدالة أخرى
تحياتي، أشرف السمهوري
24-05-2009, 05:14 PM
جزاك الله خيراً اخي أشرف
__________________
لا إله الا الله محمد رسول الله فضائية الأقصى :: عينك على الوطن نيلسات: 10872 عمودي 27500
عربسات: 12054 عمودي 27500
إعلامنا.. إسلامي.. هادف.. مقاوم.. لتعلو الراية..
24-05-2009, 05:26 PM
وإياك يارب .. طيب خلص ما رح أنتظر الأعضاء ههه حتى نستغل الوقت بأكبر كم من الدوال ..
من الشاطر اللي يحاكي لنا دالة ord ؟
تحياتي، أشرف السمهوري
24-05-2009, 05:56 PM
هون بيلزمنا Look up Table، بحتوي على القيم الخاصة ب ASCII، أنا هون بدأت من القيم 32 وطالع
كود PHP:
function ord_sim ( $char ) { $LUT = array( 32 => ' ' , 33 => '!' , 34 => '"' , 35 => '#' , 36 => '$' , 37 => '%' , 38 => '&' , 39 => '\'' , 40 => '\(' , 41 => '\)' , 42 => '*' , 43 => '+' , 44 => ',' , 45 => '-' , 46 => '.' , 47 => '/' , 48 => '0' , 49 => '1' , 50 => '2' , 51 => '3' , 52 => '4' , 53 => '5' , 54 => '6' , 55 => '7' , 56 => '8' , 57 => '9' , 58 => ':' , 59 => ';' , 60 => '<' , 61 => '=' , 62 => '>' , 63 => '?' , 64 => '@' , 65 => 'A' , 66 => 'B' , 67 => 'C' , 68 => 'D' , 69 => 'E' , 70 => 'F' , 71 => 'G' , 72 => 'H' , 73 => 'I' , 74 => 'J' , 75 => 'K' , 76 => 'L' , 77 => 'M' , 78 => 'N' , 79 => 'O' , 80 => 'P' , 81 => 'Q' , 82 => 'R' , 83 => 'S' , 84 => 'T' , 85 => 'U' , 86 => 'V' , 87 => 'W' , 88 => 'X' , 89 => 'Y' , 90 => 'Z' , 91 => '[' , 92 => '\\' , 93 => ']' , 94 => '^' , 95 => '_' , 96 => '`' , 97 => 'a' , 98 => 'b' , 99 => 'c' , 100 => 'd' , 101 => 'e' , 102 => 'f' , 103 => 'g' , 104 => 'h' , 105 => 'i' , 106 => 'j' , 107 => 'k' , 108 => 'l' , 109 => 'm' , 110 => 'n' , 111 => 'o' , 112 => 'p' , 113 => 'q' , 114 => 'r' , 115 => 's' , 116 => 't' , 117 => 'u' , 118 => 'v' , 119 => 'w' , 120 => 'x' , 121 => 'y' , 122 => 'z' , 123 => '{' , 124 => '|' , 125 => '}' , 126 => '~' , 127 => '' , 128 => '€' , 129 => '' , 130 => '‚' , 131 => 'ƒ' , 132 => '„' , 133 => '…' , 134 => '†' , 135 => '‡' , 136 => 'ˆ' , 137 => '‰' , 138 => 'Š' , 139 => '‹' , 140 => 'Œ' , 141 => '' , 142 => 'Ž' , 143 => '' , 144 => '' , 145 => '‘' , 146 => '’' , 147 => '“' , 148 => '”' , 149 => '•' , 150 => '–' , 151 => '—' , 152 => '˜' , 153 => '™' , 154 => 'š' , 155 => '›' , 156 => 'œ' , 157 => '' , 158 => 'ž' , 159 => 'Ÿ' , 160 => ' ' , 161 => '¡' , 162 => '¢' , 163 => '£' , 164 => '¤' , 165 => '¥' , 166 => '¦' , 167 => '§' , 168 => '¨' , 169 => '©' , 170 => 'ª' , 171 => '«' , 172 => '¬' , 173 => '' , 174 => '®' , 175 => '¯' , 176 => '°' , 177 => '±' , 178 => '²' , 179 => '³' , 180 => '´' , 181 => 'µ' , 182 => '¶' , 183 => '·' , 184 => '¸' , 185 => '¹' , 186 => 'º' , 187 => '»' , 188 => '¼' , 189 => '½' , 190 => '¾' , 191 => '¿' , 192 => 'À' , 193 => 'Á' , 194 => 'Â' , 195 => 'Ã' , 196 => 'Ä' , 197 => 'Å' , 198 => 'Æ' , 199 => 'Ç' , 200 => 'È' , 201 => 'É' , 202 => 'Ê' , 203 => 'Ë' , 204 => 'Ì' , 205 => 'Í' , 206 => 'Î' , 207 => 'Ï' , 208 => 'Ð' , 209 => 'Ñ' , 210 => 'Ò' , 211 => 'Ó' , 212 => 'Ô' , 213 => 'Õ' , 214 => 'Ö' , 215 => '×' , 216 => 'Ø' , 217 => 'Ù' , 218 => 'Ú' , 219 => 'Û' , 220 => 'Ü' , 221 => 'Ý' , 222 => 'Þ' , 223 => 'ß' , 224 => 'à' , 225 => 'á' , 226 => 'â' , 227 => 'ã' , 228 => 'ä' , 229 => 'å' , 230 => 'æ' , 231 => 'ç' , 232 => 'è' , 233 => 'é' , 234 => 'ê' , 235 => 'ë' , 236 => 'ì' , 237 => 'í' , 238 => 'î' , 239 => 'ï' , 240 => 'ð' , 241 => 'ñ' , 242 => 'ò' , 243 => 'ó' , 244 => 'ô' , 245 => 'õ' , 246 => 'ö' , 247 => '÷' , 248 => 'ø' , 249 => 'ù' , 250 => 'ú' , 251 => 'û' , 252 => 'ü' , 253 => 'ý' , 254 => 'þ' , 255 => 'ÿ' ); foreach( $LUT as $key => $value ) { if( $value == $char [ 0 ]) { return $key ; } } }
__________________
لا إله الا الله محمد رسول الله فضائية الأقصى :: عينك على الوطن نيلسات: 10872 عمودي 27500
عربسات: 12054 عمودي 27500
إعلامنا.. إسلامي.. هادف.. مقاوم.. لتعلو الراية..
24-05-2009, 07:41 PM
موضوع جميل
بانتظار المزيد من الدوال ، الأخ MPHP خلص على كل الدوال
24-05-2009, 08:41 PM
حيّاك الله أخي فكرة
__________________
لا إله الا الله محمد رسول الله فضائية الأقصى :: عينك على الوطن نيلسات: 10872 عمودي 27500
عربسات: 12054 عمودي 27500
إعلامنا.. إسلامي.. هادف.. مقاوم.. لتعلو الراية..
24-05-2009, 08:45 PM
إقتباس:
المشاركة الأصلية بواسطة
MPHP حيّاك الله أخي فكرة
يا اخي ارحمنا خليلنا شوي دوال
هههههههه
بمزح معاك اخي
24-05-2009, 09:02 PM
رد مغلوط اسف
آخر تعديل بواسطة exchangeboss في 24-05-2009 الساعة 09:06 PM .
24-05-2009, 09:05 PM
طيب ما رأيكم في
array_chunk
__________________ محمد حمود.
24-05-2009, 09:33 PM
هههههههه ما شاء الله عليه MPHP :P
طيب قبل لا ننتقل إلى دالة أخرى وهي كما حددها mr_m دالة
array_chunk
حابب أعرض لكم محاكاتي الغبية لدالة ord حيث أني سأعتمد فيها على دالة chr التي تعاكسها في العمل ..
كود PHP:
function ord_sim ( $chr ) { for ( $i = 0 ; $i <= 200 ; $i ++) { if ( chr ( $i ) == $chr ) return $i ; } }
حطيت ليميت للأرقام من 0 إلى 200 لأني أخاف إذا خليته إنفنتي يكون فيه إدخال مو موجود وتصير حلقة لا نهائية .. عموماً يمكن تنفيذ ذلك ببساطة بجملة while و return ..
الآن دور دالة array_chunk ..
تحياتي، أشرف السمهوري
24-05-2009, 10:17 PM