从字符串末尾查找数字> 0的首次出现(位置)

时间:2019-03-18 10:56:26

标签: php

我有点问题,或者也许只是tunnelvision:我想从字符串的末尾得到第一个数字,该字符串不是 uint8。给定的字符串仅包含数字是100%安全的。

heatmap = np.uint8(np.interp(heatmap, (heatmap.min(), heatmap.max()), (0, 255)))

输出为:

0是正确的,第一个零在位置2 [索引1]。

$number = 902200100; $firstZero = strpos($number, "0"); preg_match('/[1-9]/', $n, $matches, PREG_UNMATCHED_AS_NULL, -1); var_dump($matches); echo "first zero: " . $firstZero; echo "\r\n"; echo "last non-zero: " . $matches[0][0]; 是错误的,它应该是2(从右边开始的位置3,索引2)。

我也尝试将标志更改为first zero: 1,但这并不能解决问题。偏移量last non-zero: 0在这里不起作用吗?那么正确的方法是什么?

我也将模式从[0-9]更改为[1-9],感觉有1-9根本没有输出。

沙箱:http://sandbox.onlinephpfunctions.com/code/2caa5051d73a91e6b19dd30187354b597638c68c

4 个答案:

答案 0 :(得分:3)

使用正则表达式,您可以按照以下方式使用PREG_OFFSET_CAPTURE

function maximizeNumberRoundness($n) {
    $firstZero = strpos($n, "0");
    preg_match('/([^0])0*$/', $n, $match, PREG_OFFSET_CAPTURE);

    echo "first zero: " . $firstZero;
    echo "\r\n";

    $last_nonzero_index = strlen($n) - $match[1][1] - 1;

    echo "last non-zero: " . $last_nonzero_index;
}

maximizeNumberRoundness(902200100);

输出:

first zero: 1
last non-zero: 2

据我所知,这可以正常工作,即您希望从字符串的 right 中获取最后一个非零的索引。

答案 1 :(得分:1)

这是正则表达式

preg_match('/([^0])0*$/', $string, $match);
echo $match[1];

在这种情况下,902200100的输出是

1

Sandbox

其他选择

  • strrpos-查找最右边出现的位置,例如$string[strpos($string,'0')];
  

另外,1不正确,因为我需要位置而不是值。

strrpos-请注意,r类似于strpos,但它找到的是最后一次出现的内容,而不是第一次出现的

更新

尝试一下这样的事情,现在我想我知道你想要什么。

  var_export(preg_split('/(0)/', '902200100',-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));

输出

array (
  0 => '9',
  1 => '0',
  2 => '22',
  3 => '0',
  4 => '0',
  5 => '1',
  6 => '0',
  7 => '0',
)

Sandbox

然后我将其与array_itersect($split, [0])之类的东西组合在一起。

array (
  1 => '0',
  3 => '0',
  4 => '0',
  6 => '0',
  7 => '0',
)

在这种情况下(请注意按键),其余的都很琐碎。如果您希望该位置使用单个数字,则只需使用str_split然后相交

答案 2 :(得分:0)

只有一种可能的解决方案:

$rev = strrev((string) $number);

$pos = function() use ($rev) {
  for($i=0;$i<count($rev);$i++) {
    if(rev[$i] != "0") return $i;
  }
};

echo "last non-zero": $pos();

答案 3 :(得分:0)

试试吧。如果您打算多次调用此函数,则应避免使用正则表达式。

<?php

function getLastCharacterThatIsntZero($number) {
    $characters = array_reverse(str_split((string)$number));
    foreach($characters AS $character) {
        if($character != "0") {
            return (int)$character;
        }
    }
    return false;
}

var_dump(getLastCharacterThatIsntZero(12345)); // returns 5
var_dump(getLastCharacterThatIsntZero(123450)); // returns 5
var_dump(getLastCharacterThatIsntZero(0)); // returns false