Edit report at https://bugs.php.net/bug.php?id=64054&edit=1
ID: 64054 Updated by: krak...@php.net Reported by: reptilien dot 19831209be1 at gmail dot com Summary: Alternative syntax to access, replace, count a portion of a string or an array Status: Closed Type: Feature/Change Request Package: Output Control PHP Version: Irrelevant Assigned To: krakjoe Block user comment: N Private report: N New Comment: You done everything right, I didn't see it was marked as a feature request. The reason I said it would be shot down is, look at the errors you have there, there's one in the parser and a few from execution. If this were a supported syntax it could negatively impact the parsing of array manipulation and access instructions globally. Write less and do more is right, but it's not always appropriate for everything cool to be a core feature or normal practice. So write once, and re-use can also be a good way forward :) Previous Comments: ------------------------------------------------------------------------ [2013-01-24 16:27:51] reptilien dot 19831209be1 at gmail dot com Thanks for the reply ;) It's my first report, I'm not yet familiar with the repport/request system. So excuse me if I posted in the bad place. I've chosen "Feature/Change Request" in the "Bug type" section. Wasn't is the good way? About the request/proposition, I believe that it is not more useless than the shorter syntax array recently adopted in version 5.4. Write Less, Do More... Thanks for your part of implementation. ------------------------------------------------------------------------ [2013-01-24 12:53:40] krak...@php.net I'm going to close the report, because this isn't a bug but a feature request. It's also a request likely to be shot down by the development community, still all is not lost ... <?php class CleverString implements ArrayAccess { public $string; public function __construct($string) { $this->string = $string; } public function offsetSet($key, $value) { } public function offsetGet($key) { if (($break = strpos($key, ":"))) { return substr( $this->string, (int) substr($key, 0, $break), (int) substr($key, $break+1) ); } else return substr($this->string, $key); } public function offsetExists($key) { } public function offsetUnset($key) { } } $my = new CleverString("abcdefghi"); printf("\$my[0:5]=%s\n", $my["0:5"]); printf("\$my[:5]=%s\n", $my["0:5"]); printf("\$my[0:-1]=%s\n", $my["0:-1"]); printf("\$my[1:2]=%s\n", $my["1:2"]); printf("\$my[-2]=%s\n", $my["-2"]); printf("\$my[-3:1]=%s\n", $my["-3:1"]); ?> Not a complete implementation, I got bored, but a proof of concept that all you want to do is achievable in user land without much effort. ------------------------------------------------------------------------ [2013-01-23 09:38:35] reptilien dot 19831209be1 at gmail dot com Description: ------------ This is a simply and intuitive proposition to access or replace a part of a string or an array. This syntax from partly shell script syntax. We can extend this proposition for a simply way to count the number of characteres of a string or elements of an array. Test script: --------------- $str = "abcdefghi"; $arr = array("j", "k", "l", "m", "n"); $arr1= array("j", "k", array("l", "m"), "n", "o"); Expected result: ---------------- --- Propositions : --- 1. Alternative to substr $str[0:5] // return 'abcde' $str[:5] // return 'abcde' (the same as above) $str[0:-1] // the same as $str $str[1:2] // return 'bc' $str[-2] // return 'hi' $str[-3:1] // return 'g' 2. Alternative to substr_replace $str[0:5]="jklmn"; // $str is now 'jklmnfghi' $str[:5]="jklmn"; // $str is now 'jklmnfghi' (the same as above) $str[-5]="j"; // $str is now 'abcdjfghi' $str[-5]="jklmn"; // $str is now 'abcdjklmn' $str[-5]="jklmnopqr"; // $str is now 'abcdjklmn', the rest is ignored 3. Alternative to array_slice() $arr[0:4] // return 'j', 'k', 'l', 'm' $arr[:4] // return 'j', 'k', 'l', 'm' (the same as above) $arr[0:-1] // the same as $arr $arr[-2] // return 'm', 'n' (if key -2 doesn't exist) $arr[-2:2] // force to return 'm', 'n' (without ambiguation) $arr[-3:1] // return 'l' $arr1[2:2] // return ('l', 'm'), 'n' $arr1[2:2][0] // return ('l', 'm') $arr1[2:2][1] // return 'n' 4. Alternative to array_replace() $arr[0:4]=array('a', 'b', 'c', 'd'); // $arr is now 'a', 'b', 'c', 'd', 'n' $arr[-2]=array('a', 'b'); // $arr is now 'j', 'k', 'l', 'a', 'b' (if key -2 doesn't exist) $arr[-2:2]=array('a', 'b'); // $arr is now 'j', 'k', 'l', 'a', 'b' (forced method, without ambiguation) $arr1[-3:2]=array(array('x', 'y'), 'z'); // $arr1 is now 'j', 'k', ('x', 'y'), 'z', 'o' $arr1[-3:2]=array(array('x', 'y'), 'z', 'a'); // $arr1 is now 'j', 'k', ('x', 'y'), 'z', 'o' (the rest is ignored) 5. Alternative to strlen() and count() note: in shell script, # is used to count the number of chararacters in a string; in php # is used for comments (we need an other symbol) $str[#] // musn't be used $str[?] // return 9 $arr[?] // return 5 $arr[1:-1:?] // return 4 (equivalent at count($arr)-1) Actual result: -------------- --- Actual results : --- $str[0]; // return a $arr[0]; // return j $arr1[2]; // return ('l', 'm') $str[0]="x"; // $str is now xbcdefghi $str[3]="xyz"; // $str is now 'abcxefghi' // the rest 'yz' is ignored $arr[-1]="x"; // $arr is now 'j', 'k', 'l', 'm', 'n', -1=>'x' --- Actual errors/warnings : --- $str[-1] // PHP Warning: Illegal string offset: -1 (should return 'i') $arr[-1] // PHP Notice: Undefined offset: -1 (should return 'n' if key -1 doesn't exist) $arr[-1:1] // PHP Parse error: syntax error, unexpected ':', expecting ']' (should return 'n', none ambiguation) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=64054&edit=1