根据php中元素的最后和第一个字符匹配排列数组元素

时间:2014-05-20 12:28:38

标签: php

给定一个单词串以这样的顺序排列它们,使X -> Y -> Z之类的单词成为X的最后一个字符是Y的第一个字符,并且最后一个字符为Y Z"sam let mat xaml tax" 的第一个字符。

例如:

"sam mat tax xaml let"

将成为

{{1}}

2 个答案:

答案 0 :(得分:1)

我的此算法版本会重新排列单词,但是: - 不包括那些不能形成单词链的单词(单词链起始于至少找到一个巧合的单词) - 不会重新启动另一个链,其余的单词与第一个单词链不一致。也就是说,只有一个词链

也就是说:

" ysamz让mat xaml gallery tax"

会给:

让税xaml

发生这种情况是因为它没有找到ysamz,gallery和mat的任何巧合。

http://sandbox.onlinephpfunctions.com/code/7f911e410510980331627832889816997abe24db

 function right($string,$chars) 
 { 
  $vright = substr($string, strlen($string)-$chars,$chars); 
  return $vright; 
} 
function left($string,$chars){ 
    $vleft=substr($string, 0,$chars);
    return $vleft;
} 
function findone($str,&$strArray,$currentword)
{
  $chosen="";
  foreach ($strArray as $i => $strinarray) 
  {
      if(left($strinarray,1)==$str)
      {
          $chosen=$strinarray;
          unset($strArray[$i]);
          break;
      }
  }
  return $chosen;
}
function findonepattern($str,&$strArray,$currentword)
{
   $chosen="";
    $coincidences=preg_grep('/^'.$str.'.*$/', $strArray);
    if(sizeof($coincidences)>0)
  {
     $chosen=current($coincidences);
     $delWord=array_keys($strArray, $chosen);
      unset($strArray[$delWord[0]]);
      $strArray=array_values($strArray);

    }

 return $chosen;

}


function rearrange($lastvalue,&$strArray)
{
    global $finalArray,$globalcount;
    $last=right($lastvalue, 1);
  // $chosen=findonepattern($last,$strArray,$lastvalue);
 $chosen=findone($last,$strArray,$lastvalue);
    if(!empty($chosen))
    {
    //this line is commented because if there is more than one similar word
          //it would not consider the second one
          //  if(!in_array($chosen, $finalArray)) $finalArray[]=$chosen; 
        $finalArray[]=$chosen;   

       rearrange($chosen, $strArray);
   }
 if(sizeof($finalArray)==1 && $globalcount<sizeof($strArray)) 
  {
    $globalcount++;
    $finalArray[0]=$strArray[$globalcount];
     rearrange($finalArray[0], $strArray);
  }
    return $finalArray;
}
$globalcount=0;
    $thestring="sam let mat xaml tax";
    $strArray=explode(" ",$thestring);
    $strArray=array_filter($strArray);
    $finalArray=array();
    $finalArray[]=$strArray[0];
    unset($strArray[0]);
    $finalArray=rearrange($finalArray[0],$strArray);
    foreach($finalArray as $finalstr)
    {
     echo $finalstr." ";
    }

PREG PATTERN 而不是使用使用&#34; left&#34;的findone函数,您可以使用模式但性能更差:

function findonepattern($str,&$strArray,$currentword)
{
   $chosen="";
    $coincidences=preg_grep('/^'.$str.'.*$/', $strArray);
    if(sizeof($coincidences)>0)
  {
     $chosen=current($coincidences);
     $delWord=array_keys($strArray, $chosen);
      unset($strArray[$delWord[0]]);
      $strArray=array_values($strArray);

    }

 return $chosen;

}

你可以在这里看到3000字的表现:

http://sandbox.onlinephpfunctions.com/code/5ae84a2dadc8140eeb1e776d74059a204877bf0a

第一个解决方案:aprox。 0.3秒 第二种解决方案(preg):aprox 1秒

答案 1 :(得分:1)

尝试递归函数:

<?php
$myStr = "sam let mat xaml tax";
var_dump($myStr);

$myStr = explode(' ', $myStr);
$finalArr = find($myStr[0], $myStr, array(), array());
$finalArr = array_unique($finalArr);

$strFinal = implode(" ", $finalArr);
var_dump($strFinal);

function find($currentWord, $myStr, $OUTPUT = array(), $unic = array()){
    $indexWord = array_search($currentWord, $myStr);
    $findFlag = false;
    foreach($myStr as $keyInLoop=>$wordInLoop){
        if(substr($currentWord, -1) == $wordInLoop[0]){
            $findFlag = true;
            $OUTPUT[] = $currentWord;
            $OUTPUT[] = $wordInLoop;
            unset($myStr[$indexWord]);
            $myStr = array_values($myStr);

            if(!count($myStr)) return array_merge($OUTPUT, $unic);
            elseif(count($myStr) == 1) {$unic[count($OUTPUT)+count($unic)+1] = $myStr[0]; return array_merge($OUTPUT, $unic);}
            else return find($wordInLoop, $myStr, $OUTPUT, $unic);
        }
    }
    if(!$findFlag){
        $unic[count($OUTPUT)+count($unic)+1] = $currentWord;
        unset($myStr[$indexWord]);
        $myStr = array_values($myStr);
        if(!count($myStr)) return array_merge($OUTPUT, $unic);
        elseif(count($myStr) == 1) {$unic[count($OUTPUT)+count($unic)+1] = $myStr[0]; return array_merge($OUTPUT, $unic);}
        else return find($myStr[0], $myStr, $OUTPUT, $unic);
    }
}
?>