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の標準関数の組み合わせでアルファベット順に並び替える
関数はつくれないのか?
どなたか、ご意見お聞かせください。
よろしくお願いします。
No.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");
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- Visual Basic(VBA) VBA ユーザーフォームからSubプロージャ―に値を引き渡す方法 3 2023/04/09 01:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<A href ~で複数の値を渡したい
-
if (isset($_a)&&$_a)この意味は
-
SQLにあるデータをWEB画面に出...
-
五十音表示したいのですが、SQL...
-
phpについについて質問3
-
日付を基にした乱数生成
-
Dosブロンプトでtabを出力したい
-
wordの差し込み印刷で文字...
-
「取得先」という表現について
-
URLのパラメータをGETのままで...
-
switch()文で値の大小比較
-
shシェルスクリプト 空白行の...
-
DTOとEntityの差は何ですか。
-
VB2005でXMLデータから複数ある...
-
昨日の日付を取得するVBscript
-
POSTで受け渡したものを保存し...
-
WordでExcelデータを差込...
-
phpでcookieがうまく保存されない
-
IPアドレスとMACアドレスを取得...
-
アクセスの度にIPアドレスを変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日付を基にした乱数生成
-
<A href ~で複数の値を渡したい
-
「次の10件を表示する」のよ...
-
PHPでwait処理ってできます?
-
POSTされたかどうか確かめる方...
-
PHPのif文「POSTしていな...
-
テーブルに送信ボタンをつける
-
PHPでのNULLの正規表現
-
PHP フラグ
-
if文の複数条件。
-
if (isset($_a)&&$_a)この意味は
-
逆順表示したい?
-
PHP ハイパーリンク
-
Luaにて、and or の組み合わせ...
-
null代入とunset()の違いについて
-
SQLのデータを分割してブラウザ...
-
$_SERVER["QUERY_STRING"]の仕...
-
whileループの中でフォーム入力...
-
switch文で2つ以上の変数の値...
-
parse_ini_fileでダブルクォー...
おすすめ情報