アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPのstrcmp関数の動きがよくわかりません。
strcmp
(PHP 4, PHP 5)

strcmp — バイナリセーフな文字列比較
説明
int strcmp ( string $str1 , string $str2 )

この比較は大文字小文字を区別することに注意してください。
パラメータ
str1
最初の文字列。
str2
次の文字列。
返り値

str1 が str2 よりも小さければ < 0 を、str1が str2よりも大きければ > 0 を、 等しければ 0 を返します。
・・・・・・・・・とマニュアルには上記のようにあります。

聞きたい事!▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
1 このstr1がstr2より大きいとはどういうことでしょうか?
2 実際に動きを確認するためにstrcmp関数を他のPHPのビルトイン関数で実現できないのでしょうか?

私の想像では、この関数にあたえる二つの引数を10進数に変換して、値の大きさを比較するという方法なのですが・・。
たとえば
<?php
$str01 = "a";
$str02 = "b";
print strcmp($str01,$str02);
print "<br />";
//上記の値は-1がでるためこの場合 $aのほうが$bより小さいことになる。

//$aの値の文字aが小さいとは?どういうことか
//私の、ぱっと思いついた方法は、以下のような意味?
$str01 = bin2hex($str01);
print $str01 ; //16進数でaという値を表すと61がでる
print "<br />";
$str01 = hexdec($str01);
print $str01; //10進数でaという値を表すと97がでる
print "<br />";

//上記を同じく$bに行うと
$str02 = bin2hex($str02);
print $str02 ; //16進数でaという値を表すと62がでる
print "<br />";
$str02 = hexdec($str02);
print $str02; //10進数でaという値を表すと98がでる
print "<br />";

print "<hr />";
/*
結果、$aは$bより 【小さい】という事なのでstrcmpは-1を返したと・・・。
こういう事をかんがえてみました。
そしてこれは、普通に考えれば a => bという順序なので
アルファベット順になります。
しかしこのやり方だと
*/
$str03 = "aaaaaaa";
$str04 = "bb";

//と上記のような文字列があった場合同じく同じ手順で値をだすと
$str03 = bin2hex($str03);
print $str03 ; //16進数でaという値を表すと61616161616161がでる
print "<br />";
$str03 = hexdec($str03);
print $str03; //10進数でaという値を表すと27410143614427489がでる
print "<br />";

//上記を同じく$bに行うと
$str04 = bin2hex($str04);
print $str04 ; //16進数でaという値を表すと6262がでる
print "<br />";
$str04 = hexdec($str04);
print $str04; //10進数でaという値を表すと25186がでる
print "<br />";

/*ただ上記の方法だと、$str03と$str04を比較すると$str04の【bb】という値の方が
小さくなり順序的には bb => aaaaaaとなりアルファベット順にするとこができない。

三つ目の質問
3 アルファベット順にソートしたいとき標準のsort関数を使わずに他のPHPの標準関数の組み合わせでアルファベット順に並び替える
関数はつくれないのか?
どなたか、ご意見お聞かせください。
よろしくお願いします。

A 回答 (1件)

> 1 このstr1がstr2より大きいとはどういうことでしょうか?


辞書式順序で後の方に来る文字列の方が大きいです。

よく分からないなら、英和辞書で適当な単語を2つ探してください。
後のページに書かれている単語の方が「大きい」です。

> 2 実際に動きを確認するためにstrcmp関数を他のPHPのビルトイン関数で実現できないのでしょうか?
phpは数回くらいしかさわったこと無いけど、
たぶんこれでいいんじゃないかな。

function my_strcmp($a, $b)
{
 for($i=0;;$i++){
  $a_char = ord($a[$i]); #文字列$aの$i番目文字の文字コード
  $b_char = ord($b[$i]); #文字列$bの$i番目文字の文字コード

  if( $a_char != $b_char ) {
   break;
  }

  if( $a_char == 0 ) { #文字列末尾まで等しいなら、文字列全体が等しい
   return 0;
  }
 }

 if ($a_char>$b_char){return +1;}
 elseif($a_char<$b_char){return -1;}
 else {return 0;}
}

> 3 アルファベット順にソートしたいとき標準のsort関数を使わずに
> 他のPHPの標準関数の組み合わせでアルファベット順に並び替える関数はつくれないのか?
比較関数を指定できるusortを使って

$a = array("abc","abcd","aaaa","bbbb");
usort($a,"strcmp");
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!