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

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

ただいまの
回答率

90.52%

  • PHP

    20298questions

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

PHP:文字列の一部を比較して最小値を判別し、最小値を持つ「元の文字列の比較した部分以外」を取得したい

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 515

igaiga

score 114

下記のソースコードのようにして配列からtime以降の数字が最小のものを取得します。
この時、min($b)の結果が5なので、対になる150を取得したいのですが、
簡単に紐付ける方法がわかりませんでした。

$arrayをpreg_matchで再度検索させて「time5」を含むしか文字列を検索するしか無いでしょうか。もっとスマートに取得できればと思いまして、お知恵を拝借できれば幸いです。

ソースコード

$array = array('150time5','130time6','144time9');

foreach ($array as $list) {
      preg_match('/([0-9]+)time([0-9]+)/',$list ,$val );
      $a[] = $val[1];
      $b[] = $val[2];
}
$b_val = min($b);
$b_val = "time" . $b_val;

foreach ($array as $list) {
      if(preg_match('/([0-9]+)time5/',$list ,$val2 )){
            $c = $val2[1];
      }
}
echo $c;//150が出力される
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+1

こんな感じでしょうか。

$array = array('150time5','130time6','144time9');

foreach ($array as $list) {
      preg_match('/([0-9]+)time([0-9]+)/',$list ,$val );
      $a[] = $val[1];
      $b[] = $val[2];
}

echo $a[array_search(min($b),$b)];

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/01 17:03

    ありがとうございます。テストしてみたところ、想定どおり値が取れました。
    $a[]と$b[]で添字がずれると正しく値がとれなくなるという認識であってますか?

    キャンセル

  • 2017/03/01 17:49

    はい、あってます。

    キャンセル

  • 2017/03/02 01:25

    ありがとうございます。初心者向けで分かり易いのでベストアンサーにさせていただきました。

    キャンセル

  • 2017/03/02 08:29

    あくまでも提示されているコードをベースにした場合の例です。
    他の回答のように、やり方はいくらでもあります。
    色々参考にしてスキルアップしていってください。

    キャンセル

+1

いったん配列に入れてminを使う、なんて面倒なことはせずに、直接foreachの中で割り出してしまいましょう。

$array = array('150time5','130time6','144time9');
// 来るであろう値よりじゅうぶん大きな値
$min_val = 1e100;
$min_text = '';

foreach ($array as $list) {
      preg_match('/([0-9]+)time([0-9]+)/',$list ,$val );
      if((float)$val[2] >= $min_val) continue;
      $min_val = (float)$val[2];
      $min_text = $list;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/01 17:10

    すみません。理解力が足りず再現できませんでした;;

    キャンセル

+1

<?php
$array = array(
        '150time5','130time6','144time9', // 正常値
        '260time5', // time以降の数字が重複している場合
        '150time5', // 全て重複している場合
        'hoge', '150tine5', '150time' // 異常値(無視される)
);

foreach ($array as $list) {
    if (preg_match('/([0-9]+)time([0-9]+)/',$list ,$val) === 1) {
        $data[$val[2]][] = $val[1];
    }
}

$tmp = $data[min(array_keys($data))];
$results = array_values(array_unique($tmp));

print_r($data);
print_r($results);


実行結果

Array
(
    [5] => Array
        (
            [0] => 150
            [1] => 260
            [2] => 150
        )

    [6] => Array
        (
            [0] => 130
        )

    [9] => Array
        (
            [0] => 144
        )

)
Array
(
    [0] => 150
    [1] => 260
)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

preg_match を使わない方法も。

<?php

$array = ['150time5', '130time6', '144time9'];

$a = [];
$b = [];

foreach ($array as $str) {
    $format = '%dtime%d';
    list($num1, $num2) = sscanf($str, $format);
    $a[] = $num1;
    $b[] = $num2;
}

echo $a[array_search(min($b), $b)];

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

解説つけときます

$array = ['150time5','130time6','144time9','260time5','150time5','999time4'];
$pattern="/^(\d+)time(\d+)$/m";
preg_match_all($pattern,implode($array,"\n"),$m, PREG_SET_ORDER );
//$arrayを改行マークでつなげて一つの文字列にし、$patternで数値を吸い出し$mにおさめる
print_r($m);//確認

usort($m,function($a,$b){return $a[2]==$b[2]?0:$a[2]>$b[2];});
//$mの各要素について2番めの要素を使ってソートする。一番小さいのが先頭にくる
print_r($m);//確認

print $m[0][1];
//$mの0番目の要素の1番めの要素をとればOK

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/01 16:38

    ちょっと私には難しくて、理解できませんでした。。。これは、$arrayが増えた場合も問題ないのでしょうか?

    キャンセル

  • 2017/03/01 16:48

    理解しづらそうなので解説つけときました

    キャンセル

  • 2017/03/02 01:21

    ありがとうございます。参考にさせていただきます。

    キャンセル

0

私が配列作るとしたらこんな感じにします。
すごい適当で申し訳ないですが、参考までに。
KiyoshiMotoki様の初期値をちょっと拝借。

<?php
$array = array(
        '150time5','130time6','144time9', 
        '260time5',
        '150time5',
        '999time4',
);

$right_min = '999';
$temp_array = [];
foreach ($array as $list) {
    $data_array = explode("time", $list);
    $data['left'] = $data_array[0];
    $data['right'] = $data_array[1];
    $data['base'] = $list;
    if($right_min > $data['right']){
        $right_min = $data['right'];
    }
    $temp_array[] = $data;
}

foreach ((array) $temp_array as $key => $value) {
    $sort[$key] = $value['right'];
}

array_multisort($sort, SORT_ASC, $temp_array);
print_r($temp_array);

echo "right_min = ".$right_min;
Array
(
    [0] => Array
        (
            [left] => 999
            [right] => 4
            [base] => 999time4
        )

    [1] => Array
        (
            [left] => 150
            [right] => 5
            [base] => 150time5
        )

    [2] => Array
        (
            [left] => 150
            [right] => 5
            [base] => 150time5
        )

    [3] => Array
        (
            [left] => 260
            [right] => 5
            [base] => 260time5
        )

    [4] => Array
        (
            [left] => 130
            [right] => 6
            [base] => 130time6
        )

    [5] => Array
        (
            [left] => 144
            [right] => 9
            [base] => 144time9
        )

)
right_min = 4

ご参考までに

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/01 16:52 編集

    最終的に表示したいのは [left] ( = 999) の方ですよ。

    キャンセル

  • 2017/03/01 17:05

    はい、この配列ならleftを表示するのも簡単だろうという意味で、後はお好きなように表示させてくださいという例でした。
    並び替えも添えてあるので、大きい順や小さい順に、キーを変えてleftでも並び替えたりと、いろいろ捗るので、まず、ベースの配列から参考までに変えてみようという提案でした。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20298questions

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

  • トップ
  • PHPに関する質問
  • PHP:文字列の一部を比較して最小値を判別し、最小値を持つ「元の文字列の比較した部分以外」を取得したい