我正在寻找从任何数字获取字母格式的最短路径。我可以用很多条件来做,如果,elseif-s,但我需要简短的方法。
$mynumber=35566693;
$mynumber2=9444333;
echo some_format_function($mynumber).', ';
echo some_format_function($mynumber2);
//result should be something like ABBCCCDA, ABBBCCC
更新:详细说明 - 根据这些规则,应将编号转换为字母格式: 1.首先出现的数字应转换为A,第二个数字应转换为B,第三个数字转换为C,依此类推。 2.重复的数字应转换为相同的字母(3453 => ABCA,而不是ABCD,而不是JKSJ)
答案 0 :(得分:3)
试图在回答之前成为第一个真正读你的问题的人,试试这个:
function num_to_letter($num) {
$map = array();
$letters = str_split("ABCDEFGHIJ"); // ten characters
return preg_replace_callback("/\d/",function($n) use (&$map,&$letters) {
$digit = $n[0];
if( !isset($map[$digit])) $map[$digit] = array_shift($letters);
return $map[$digit];
},$num);
}
用法:
echo num_to_letter(3556693); // ABBCCDA
对于较长的数字,请将它们作为字符串传递:
echo num_to_letters("1123124648976127846187243232234");
// AABCABDEDFGHEABHFDEAFHBDCBCBBCD
答案 1 :(得分:0)
str_replace(
[0,1,2,3,4,5,6,7,8,9],
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
$mynumber
);
应该做的伎俩。
UPD 对于本地字母顺序:
$a=[0,1,2,3,4,5,6,7,8,9]; // stub subst array
$l=chr(ord('A')-1); // first letter
foreach(str_split($mynumber) as $sym) {
if(is_int($a[$sym])) // first meet
$a[$sym] = $l = chr(ord($l)+1);
}
str_replace( // let’s go
[0,1,2,3,4,5,6,7,8,9],
$a,
$mynumber
);
答案 2 :(得分:0)
正如你解释的那样,你想要的是这样的功能:
<?php
$mynumber=35566693;
$mynumber2=9444333;
$mynumber3=3453;
echo some_format_function($mynumber).', ';
echo some_format_function($mynumber2).', ';
echo some_format_function($mynumber3);
function some_format_function ($int) {
$out = '';
$use = array('A','B','C','D','E','F','G','H','I','J');
$usedIndex = -1;
$mappings = array();
for ($x =0; $x<strlen($int);++$x) {
$curChar = substr($int,$x,1);
if (!isset($mappings[$curChar])) {
++$usedIndex;
$mappings[$curChar] = $use[$usedIndex];
}
$out .= $mappings[$curChar];
}
return $out;
}