php to set order of preference of an Array Sequence using string length -
$records = array( '123pp' => 3.63, '123ddd' => 9.63, '123d' => 6.63, '123pppp' => 9.63, '123dd' => 9.63, '123p' => 2.63, '123ppp' => 1.53 ); after looping through records, have 1 value key should 123d because order of preference is: 123d, 123p, 123dd, 123pp, 123ddd, 123ppp, 123pppp...
for e.g.:
- if
123dnot found in array,123panswer. - if
123pnot found in array,123ddanswer.
and have found solution :
foreach ($records $key => $value) { if (empty($this->minlength)) { $this->invoicetax = $value; $this->minlength = strlen($key); } elseif (strpos($key, 'p') !== false && (strlen($key) < $this->minlength)) { $this->invoicetax = $value; $this->minlength = strlen($key); } elseif (strpos($key, 'd') !== false && (strlen($key) <= $this->minlength)) { $this->invoicetax = $value; $this->minlength = strlen($key); } but want know if code can optimised not storing string length of every key.
this function tidied solved recursion. means if 123d in array code highly optimised , run once, twice 123p, 3 times 123dd, etc.
function getmostpref($records, $key = "123", $next = "d", $depth = 0) { if($depth == count($records)) { // hit end of array nothing found return false; } if(strpos($next, 'd') !== false) { // looking @ 'd...' key. // next key same length key ps. $nextkey = str_repeat('p', strlen($next)); } else if(strpos($next, 'p') !== false) { // looking @ 'p...' key. // next key has 1 char , ds. $nextkey = str_repeat('d', strlen($next)+1); } else { // key not valid return false; } if(array_key_exists($key.$next, $records)) { // found key in array return it. return $records[$key.$next]; } else { // recursive call next key , increased depth. return getmostpref($records, $key, $nextkey, $depth + 1); } } // testing $records = array( '123pp' => 3.63, '123ddd' => 9.63, '123d' => 6.63, '123pppp' => 9.63, '123dd' => 9.63, '123p' => 2.63, '123ppp' => 1.53 ); // finds 123d , returns 6.63 echo getmostpref($records);
Comments
Post a Comment