質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

7回答

357閲覧

後方からの文字の切り出しがうまくいかない

Tatsuo_Iriyama

総合スコア50

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2019/01/24 10:05

編集2019/01/24 10:06

##前提と期待値

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/26 08:18

回答でネタをかいておいてなんだが 13桁の場合の想定は?
guest

回答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

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/01/24 13:43

配列にしたぶんだけ迂遠ですね。wordwrapとはね。bufferをそう解決する方法があるとは。
papinianus

2019/02/08 08:24

bufferするのにarray_chunkという便利関数があることを今日知った
guest

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
yambejp

総合スコア114777

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/01/24 13:42

wordwrap()がすごいです。 array_map('strrev', array_slice… で行けると思います。
guest

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
okinaka3

総合スコア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

これ、俺もやっちゃったけど、例えば`$number = 100000000000`で`4桁, 4桁, 余り`にならないんですよねぇ。。。 何が要件なのか微妙ですけどw
退会済みユーザー

退会済みユーザー

2019/01/26 07:58

sprinff で整形するのもありでは?
退会済みユーザー

退会済みユーザー

2019/01/26 08:09

13桁のときに4つに分かれるから 4:4:あまりじゃないよ
退会済みユーザー

退会済みユーザー

2019/01/26 08:11

間違ってはいないと思うんだけど、どういうこと?
退会済みユーザー

退会済みユーザー

2019/01/26 08:16

質問者のケースだと常に3つに分けたいように見える
退会済みユーザー

退会済みユーザー

2019/01/26 08:24

ああ、なるほどw
guest

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

rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/01/24 10:56

桁が8以下の場合の命題に沿ってませんね
rururu3

2019/01/24 11:05

もしかして配列3つにしないといけないとかなら沿ってませんが、そういうことですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問