##前提と期待値
php
1$number = 123456789;
上記のような数字があり、これを後方から4桁, 4桁, 余り
ずつ切り出します。
※$number
は正数です。PHPのバージョンは7.2.6
です
期待値としては、
php
1A => 6789 2B => 2345 3C => 1
このような形としたいです。
もし8桁しかない場合
php
1A => 6789 2B => 2345 3C => ''
としたいです。
もし、4桁しかない場合
php
1A => 6789 2B => '' 3C => ''
としたいです。
もし、5桁の場合
php
1A => 6789 2B => 5 3C => ''
としたいです。
##やった事
php
1$number = 123456789; 2$numberLen = strlen($number); 3 4$a = substr($number, (-1 * $numberLen), 4); 5$b = substr($number, (-1 * $numberLen) + 4, 4); 6$c = substr($number, (-1 * $numberLen) + 8, 4);
上記のようなコードを書きました。
しかし、これでは$numberLen
が3の場合、+4
をすると、結果が1
となる為、先頭から取得する形となります。
なので、ボツコードとなりました。
##質問
期待値のような結果を得るにはどう実装すれば良いでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
色々妄想して書いてみた。
php
1<?php 2$numbers = [ 3 1234567890123456789, 4 1000000000000000000, 5 1234567890, 6 234567890, 7 34567890, 8 4567890, 9 567890, 10 67890, 11 7890, 12 890, 13 90, 14 0, 15]; 16 17function hoge($number){ 18 echo '$number = ' . $number . PHP_EOL; 19 $str = 'a'; 20 $last_str = ''; 21 do { 22 $last_str = $str; 23 ${$str++} = sprintf("%'04d",($number % 10000)); 24 $number = (int)($number / 10000); 25 } while($number >= 1); 26 $str = in_array($str, ['a', 'b', 'c'])? 'd' : $str; 27 for($i = 'a'; $i !== $str; ++$i){ 28 echo strtoupper( $i . ' => '); 29 if(isset(${$i})) { 30 if ($i !== $last_str) { 31 echo ${$i}; 32 } else { 33 echo (int)${$i}; 34 } 35 } else { 36 echo '\'\''; 37 } 38 echo PHP_EOL; 39 } 40} 41 42foreach($numbers as $number){ 43 hoge($number); 44}
色々後悔はしたw
投稿2019/01/24 14:36
編集2019/01/25 16:32退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
やりたいことがかなり都合がよい感じになっている気がするので、細分化してみた。
php
1<?php 2$number = 123456789; 3 4//まず12個にする 5$array = array_pad(str_split($number.""), -12, ""); 6 7//逆順にする(うしろから取りたいとの要件のため) 8$rev = array_reverse($array); 9 10//bufferする、4個ずつを3行に 11$buffered = buffer($rev, 4, 3); 12 13//各行を逆順にする(9876を6789にする) 14$reversed = array_map('array_reverse', $buffered); 15 16//連結する(56789のとき2つめを["","","","5"]->"5"にする 17$joined = array_map(function($row){return implode("", $row);}, $reversed); 18var_dump($joined); 19 20//bufferする便利関数をしらなかったので自分で書いた。 21function buffer($array, $unit, $count) { 22 $normalized = array_pad($array, $unit * $count, ""); 23 $ret = []; 24 for($outer = 0; $outer < $count; $outer++) { 25 $ret[] = array_slice($normalized, $outer * $unit, $unit); 26 } 27 return $ret; 28}
投稿2019/01/24 13:36
総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/24 13:43
2019/02/08 08:24
0
無理矢理感つよめ
PHP
1$len=4; 2$count=3; 3$number = 123456789; 4$arr = array_map(function($x) { 5 return strrev($x); 6},array_slice( 7 array_merge( 8 explode("\t",wordwrap( 9 strrev( 10 $number 11 ),$len, "\t",true 12 ) 13 ),array_fill(0,$count-2,"") 14 ),0,$count 15 ) 16); 17print_r($arr);
投稿2019/01/24 10:41
編集2019/01/24 10:44総合スコア114777
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
単純に3つに分けてみました。
php
1 $a = substr($number, -4); 2 $b = substr(substr($number, -8), 0, -4) ?: ''; 3 $c = substr($number, 0, -8) ?: '';
投稿2019/02/13 13:48
編集2019/02/14 00:23総合スコア304
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ほぼネタ。 スペースはトリムだ!!
コード
hi = fopen('php://stdin', "r"); while (true) { fscanf($hi, "%s", $n); if ($n == "END") break; $line = sprintf("%-20s",$n); echo $line; echo " : [ "; echo substr($line, 0, 4); echo " "; echo substr($line, 4, 4); echo " "; echo substr($line, 8); echo "]"; echo PHP_EOL; }
STDIN
1234567890123 123456789012 12345678901 1234567890 123456789 12345678 1234567 123456 12345 1234 123 12 1 END
STDOUT
1234567890123 : [ 1234 5678 90123 ] 123456789012 : [ 1234 5678 9012 ] 12345678901 : [ 1234 5678 901 ] 1234567890 : [ 1234 5678 90 ] 123456789 : [ 1234 5678 9 ] 12345678 : [ 1234 5678 ] 1234567 : [ 1234 567 ] 123456 : [ 1234 56 ] 12345 : [ 1234 5 ] 1234 : [ 1234 ] 123 : [ 123 ] 12 : [ 12 ] 1 : [ 1 ]
投稿2019/01/26 08:00
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
php
1<?php 2 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6$number = 1234567890; 7 8$i = 0; 9$arr = []; 10while ($number > 0) { 11 $res = fmod($number, pow(10, 4)); 12 $number = ($number - $res) / pow(10, 4); 13 $arr[] = ($number > 0) ? sprintf('%04d', $res) : sprintf('%01d', $res); 14} 15var_dump($arr);
こういうことか
php
1<?php 2 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6$number = 1234567890123; 7 8$i = 0; 9$arr = []; 10while ($number > 0 && count($arr) < 3) { 11 $res = fmod($number, pow(10, 4)); 12 if (count($arr) < 2) { 13 $arr[] = ($number > 10000) ? sprintf('%04d', $res) : sprintf('%01d', $res); 14 } else { 15 $arr[] = $number; 16 } 17 $number = ($number - $res) / pow(10, 4); 18} 19var_dump($arr); 20
投稿2019/01/26 07:03
編集2019/01/26 08:25退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/01/26 07:46
退会済みユーザー
2019/01/26 07:58
退会済みユーザー
2019/01/26 08:09
退会済みユーザー
2019/01/26 08:11
退会済みユーザー
2019/01/26 08:16
退会済みユーザー
2019/01/26 08:24
0
4文字取り出して4文字削除してを繰り返すのはどうでしょう
php
1<?php 2$number = 123456789; 3$number = "{$number}"; 4$list = []; 5while(empty($number) === false) { 6 $list[] = substr($number, -4); 7 $number = substr_replace($number, '', -4); 8} 9var_dump($list);
投稿2019/01/24 10:26
総合スコア5545
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。