個人総括php筆記試験問題3


7.PHPにおけるempty()とisset()の区別empty
変数がNullまたはゼロ以外の値である場合、empty()はFALSEを返します.すなわち、「0」、「0」、「0」、「NULL」、「FALSE」、「array()」、「var$var」、「未定義」、および属性を持たないオブジェクトが空とみなされ、varが空である場合、TRUEに戻る.
isset
変数が存在する場合(NULL以外の場合)はTRUEに戻り、そうでない場合はFALSE(未定義を含む)に戻ります.変数値はnullに設定され、falseに戻ります.unset変数の1つが存在すると、変数はキャンセルされます.issetはNULL値変数に対して特殊な処理を行います.
is_null
入力値【値、変数、式】がnullであるかどうかを検出し、1つの変数のみが定義され、その値がnullである場合、TRUEに戻ります.その他はFALSEに戻ります【未定義変数が入力されるとエラーになります!】
8.forとforeachどちらが速いforeachがもっと速いですか.
全体的に、データベースが数十万を超えた場合、速いか遅いかを見ることができ、10万を下回るサイクルであれば、テストする必要はありません.phpはforeachがおすすめです.
数値配列をループする場合,forは事前count($arr)で配列長を計算する必要があり,自己増加変数$iを導入する必要があり,ループごとに条件判断$iを行う.
一方、foreachループ配列の場合、ポインタは自動的に次の要素を指し、配列の長さを計算する必要がなく、条件判断や自己増加変数がなく、要素を呼び出す際にもハッシュ操作がないため、forやwhileよりも性能が高いに違いない.また、forとwhileは、キー値マッピングが存在する関連配列に対して無力である.だから、配列を巡って、foreachを優先します.foreachも私のPHPの中で一番好きなキーワードです.それは確かに強いからです.array_map/array_filter/array_walkが配列を巡る方式はforeachと同様であるが、コールバック関数を実行する必要があるためforeachよりも遅い.
参照先:http://www.cnblogs.com/niniwzw/archive/2008/06/03/1212535.html
9.phpのメモリ管理メカニズムとゴミ回収メカニズムphpのメモリ管理メカニズムは、変数を格納するために予め空間を与え、空間が足りない場合は、新しい空間を申請することである.
ゴミ回収:
1.5.2またはそれ以前のバージョンでは、PHPはrefcount値に基づいてゴミかどうかを判断する
refcount値が0の場合、PHPはゴミとして放出されます
この回収機構には欠陥があり,環状参照の変数に対しては回収できない.
2.5.3以降のバージョンではゴミ回収メカニズムが改善された
zval容器のrefcountが増加していることが判明した場合は、ゴミではありません.
zval容器のrefcountが減少していることが判明した場合、0に減少した場合、直接ゴミとして回収します.
zval容器内のrefcountが減少し、0に減少していないことが判明した場合、PHPはこの値をバッファに配置し、ゴミの可能性がある疑いの対象とします.
バッファが臨界値に達すると、PHPは自動的にメソッドを呼び出して各値を巡り、ゴミであることが判明したらクリーンアップします.
参照先:http://www.cnblogs.com/zk0533/p/5667122.html
10.中間変数を用いずに2つの値を交換/文字列バージョンと組み合わせてsubstr,strlenの2つの方法で実現する
$a="a";
$b="b";
echo '    $a:'.$a.',$b:'.$b.'
'; $a.=$b; $b=substr($a,0,(strlen($a)-strlen($b))); $a=substr($a, strlen($b)); echo ' $a:'.$a.',$b:'.$b.'
'; echo '-----------------------
';

//文字列バージョンstr_の使用replaceメソッド実装
$a="a";
$b="b";
echo '    $a:'.$a.',$b:'.$b.'
'; $a.=$b; $b=str_replace($b, "", $a); $a=str_replace($b, "", $a); echo ' $a:'.$a.',$b:'.$b.'
'; echo '-----------------------
';

//文字列バージョンはlistメソッドとarrayを組み合わせて実現
$a="a";
$b="b";
echo '    $a:'.$a.',$b:'.$b.'
'; list($b,$a)=array($a,$b); echo ' $a:'.$a.',$b:'.$b.'
'; echo '-----------------------
';

//文字列と数字の両方に異種演算を適用
$a='a';
$b='b';
echo '    $a:'.$a.',$b:'.$b.'
'; $a=$a^$b; $b=$b^$a; $a=$a^$b; echo ' $a:'.$a.',$b:'.$b.'
'; echo '-----------------------
';

//数字のみ
$a=3;
$b=5;
echo '    $a:'.$a.',$b:'.$b.'
'; $a=$a+$b; $b=$a-$b; $a=$a-$b; echo ' $a:'.$a.',$b:'.$b.'
';

11.英字、スペース、数字の個数をそれぞれ計算する1行の文字を入力します.
echo $str = " a b1c  2  34 ^&*5";
preg_match_all("/[0-9]{1}/",$str,$arrNum);
preg_match_all("/[a-zA-Z]{1}/",$str,$arrAl);
preg_match_all("/([/x{4e00}-/x{9fa5}]){1}/u",$str,$arrCh);
$length = strlen($str)-(count($arrNum[0])+count($arrAl[0])+count($arrCh[0]));
for ($i=0;$i";
echo "    :".count($arrCh[0])."
"; echo " ".$num."
"; echo " :".count($arrNum[0])."
"; echo " :".$length;

12.プログラムを作成して、1,2,3を使って、この3つの数はどれだけ互いに異なっていて重複しない3桁を構成することができて、すべていくらですか?
        $i = $j = $k = $t = 0; 
        for ($i = 1; $i <= 4; $i++) {
            for ($j = 1; $j <= 4; $j++) {
                for ($k = 1; $k <= 4; $k++) {
                    if ($i != $j && $j != $k && $i != $k) {
                        $t+=1;
                        dump($i * 100 + $j * 10 + $k);
                    }
                }
            }
        }
        dump('  :' . $t);

13.プログラムを作成し、nを入力してnを求める!(再帰処理で)
    public function test($n) {
        if ($n == 0 || $n == 1)
            return 1;
        else
            return $n * $this->test($n - 1);
    }