情弱エンジニアのなかのblog

一人前のエンジニアになる為のブログです

phpの関数 array_shift , mb_convert_kana , preg_matchについて

phpの関数についていくつか調べたので記載いたします。

1. array_shift

array_shift($array); は$arrayの最初の値を取り出して返します。配列 $array は、要素一つ分だけ短くなり、1つ目以降の要素は前にずれます。 数値添字の配列のキーは0から順に新たに振りなおされます。

PHP

/* 配列を定義 */
$temp = array("A", "B", "C", "D");

print_r(array_shift($temp));
echo "\n";
print_r($temp);
echo "\n";
$temp2 = array_shift($temp);
print_r($temp2);
echo "\n";
print_r($temp);

出力結果

A
Array
(
    [0] => B
    [1] => C
    [2] => D
)

B
Array
(
    [0] => C
    [1] => D
)

2. mb_convert_kana

mb_convert_kana($string , 'option') は指定した文字列を半角 ⇔ 全角 変換します。 オプションを指定した場合、オプションに従って変換します。 オプション:

:r 「全角」英字を「半角」に変換 :R 「半角」英字を「全角」に変換

:n 「全角」数字を「半角」に変換 :N 「半角」数字を「全角」に変換

:k 「全角カタカナ」を「半角カタカナ」に変換 :K 「半角カタカナ」を「全角カタカナ」に変換

PHP

/* 文字列を定義 */
$str_kana = "ABC ABC 123 123 アイウエオ アイウエオ"; 
/* 半角 ⇔ 全角 変換 */
print_r( mb_convert_kana($str_kana, 'krn') );
echo "\n";
print_r( mb_convert_kana($str_kana, 'KRN') );
echo "\n";

出力結果

ABC ABC 123 123 アイウエオ アイウエオ
ABC ABC 123 123 アイウエオ アイウエオ

3. preg_match

preg_match("/検索文字列/","文字列") はある文字列から指定した文字列を検索することができます。マッチした場合は1を返し、マッチしなかったら0を返します。

PHP

if (preg_match("/い/", "あいうえお")) {
    echo "マッチしました。";
  } else {
    echo "マッチしませんでした。";
  }
  echo "\n";
  if (preg_match("/い/", "かきくけこ")) {
    echo "マッチしました。";
  } else {
    echo "マッチしませんでした。";
  }
  echo "\n";
  if (preg_match("/しすせ/", "さしすせそ")) {
    echo "マッチしました。";
  } else {
    echo "マッチしませんでした。";
  }

出力結果

マッチしました。
マッチしませんでした。
マッチしました。

以上です。

jQueryのtoggleとfadeについて

jQueryでtoggleとfadeの使い方について調べたので記載いたします。

1. toggle

toggleの効果としまして各要素のうち、表示状態にあるものを非表示にし、非表示状態にあるものを表示状態にします。

HTML

<button>Toggle</button>
<p>Hello</p>
<p style="display: none">Good Bye</p>

f:id:nonaka-katuma-hal:20171205172409j:plain

ボタンを押すと表示が入れ替わるようにします

jQuery

$("button").click(function () {
  $("p").toggle();
});

ボタンを押すと以下のように変化します

f:id:nonaka-katuma-hal:20171205172708j:plain

2. fadeIn と fadeOut

fadeInは各要素の透明度を操作して、非表示の要素をフェードインさせて最終的に表示させます。 fadeOutは各要素の透明度を操作して、表示されている要素をフェードアウトさせて最終的に消します。

HTML

<button id="out">fadeOut</button>
<button id="in">fadeIn</button>

<p id="first">テキスト</p>

f:id:nonaka-katuma-hal:20171205174001j:plain

フェードするアニメーションは指定したスピードで実行されます。 ”slow”、”normal”、”fast”、もしくは完了までの時間をミリ秒単位で指定します。 例えば”1500”であれば、1.5秒かけてアニメーションが行われます。

jQuery

$("#out").click(function () {
  $("#first").fadeOut("slow");
});

$("#in").click(function () {
  $("#first").fadeIn("slow");
});

fadeOutボタンを押すと「テキスト」が消えていきます。

f:id:nonaka-katuma-hal:20171205174110j:plain

fadeInボタンを押すと「テキスト」が表示されます。

f:id:nonaka-katuma-hal:20171205174202j:plain

3. fadeToggle

fadeToggleはフェードインとフェードアウトを切り替えるものになります。 先ほどのフェードインフェードアウトを1つのボタンで行うことが出来ます。

HTML

<button id="toggle">toggle</button>

<p id="first">テキスト</p>

f:id:nonaka-katuma-hal:20171205175400j:plain

jQuery

$("#fadeToggle").click(function () {
  $("#first").fadeToggle("slow");
});

ボタンを押すとフェードイン、フェードアウトが交互に実行されます。

f:id:nonaka-katuma-hal:20171205175440j:plain

f:id:nonaka-katuma-hal:20171205175606j:plain

といった感じになります。

jQuery でHTMLの操作2

jQueryでHTMLの操作について記載いたします。 今回は元々記述されている要素の内容を残したままHTMLを追加する方法について調べました。 まずは以下のように記述があるとします。

HTML

    <p id="first">テキスト</p>

f:id:nonaka-katuma-hal:20171130171729j:plain

1.HTML要素内の先頭に挿入

指定した要素内部の先頭にHTMLを挿入するのに prepend()を使います。 prepend()の括弧内にHTMLを記述します

jQuery

$("p#first").prepend("<strong>先頭に挿入</strong>");

f:id:nonaka-katuma-hal:20171130172209j:plain

2.HTML要素の最後に挿入

指定した要素内部の最後にHTMLを挿入するには、 append()を使います。 prepend()と同じく括弧内にHTMLを記述します。

jQuery

$("p#first").append("<strong>最後に挿入</strong>");

f:id:nonaka-katuma-hal:20171130172606j:plain

3.HTML要素の前に挿入

指定した要素の前にHTMLを挿入するには、before()を使います。

jQuery

$("p#first").before("<strong>前に挿入</strong>");

f:id:nonaka-katuma-hal:20171130173021j:plain

4.HTML要素の後ろに挿入

指定した要素の後ろにHTMLを挿入するには、after()を使います。

jQuery

$("p#first").after("<strong>後ろに挿入</strong>");

f:id:nonaka-katuma-hal:20171130174909j:plain

といった形で今後も引き続きjQueryで試したことをまとめてブログに記載したいと思います。

CakePHP のreadとHash::getについて

cakephp でreadとHash::getの使い方を記載いたします。

1.read

データを取得してきます。 例えばCustomersModelというものがあり ファイル内でこのように記述しますと

$id = 2;
$customer_data = $this->read(false,$id);
debug($customer_data);

id2 のデータを返します

array(
    'Customers' => array(
        'id' => '2',
        'name' => 'tanaka',
        'age' => '20',
    )
)

CustomersModel以外でデータを取得したいときは以下のようになります。

$id = 2;
$customer_data = $this->Customers->read(false,$id);
debug($customer_data);
array(
    'Customers' => array(
        'id' => '2',
        'name' => 'tanaka',
        'age' => '20',
    )
)

2.Hash::get

続いてreadしてきたデータの'name'のみ必要な時はHash::getを使います。 配列から必要なデータのみ抽出することができます。

$id = 2;
$customer_data = $this->Customers->read(false,$id);

$customer_name = Hash::get($customer_data, 'Customers.name');
debug($customer_name);

nameに入っているデータのみが$customer_nameに代入されます。

'tanaka'

以上になります。

cssにおけるスタイルの優先度

cssのスタイルの優先度についてしっかり理解していなかったので 改めて調べて試したものを記載していきます。

1.基本の優先順位

まずは以下のようなHTLMにcssを付けます

HTML

<p class="first">何が優先されるか</p>

f:id:nonaka-katuma-hal:20171121172747j:plain

CSS

.first {
    color : blue;
    color : red;
}

f:id:nonaka-katuma-hal:20171121173032j:plain

これは下に記述してある方が優先されます

2.タイプセレクタとclassセレクタ

ではタイプセレクタとclassセレクタではどちらの方が優先されるかといいますと

HTML

<p class="first">何が優先されるか</p>

CSS

.first {
    color:red;
}

p {
    color : blue;
}

f:id:nonaka-katuma-hal:20171121173032j:plain

classセレクタの方が優先されます

3.classセレクタと要素を特定したclassセレクタ

classセレクタと要素を特定したclassセレクタではどうなるでしょうか

CSS

p.first {
    color : orange;
}
.first{
  color: blue;
}

f:id:nonaka-katuma-hal:20171121181611j:plain

要素を特定したclassセレクタが優先されます。

3.親要素と一緒に指定すると

今度は親要素がある時にどうなるか見てみます。 要素を特定したclassセレクタと親要素+タイプセレクタを比較します。

HTML

    <div class="first">
    <p id="second" class="third">何が優先されるか</p>

    </div>

CSS

p.third {
    color : orange;
}
.first p {
  color: blue;
}

f:id:nonaka-katuma-hal:20171121174459j:plain

要素を特定したclassセレクタと 親要素+タイプセレクタでは親要素+タイプセレクタが優先されます

4.idセレクタとclassセレクタ

idセレクタとclassセレクタではどちらが優先されるでしょうか

HTML

    <div class="first">
    <p id="second" class="third">何が優先されるか</p>

    </div>

CSS

.third {
  color : red;
}
#second {
  color : green;
}

f:id:nonaka-katuma-hal:20171121174937j:plain

idの方が優先されるようです。

5.idセレクタとclassセレクタと親要素

親要素+タイプセレクタとidセレクタとclassセレクタがある時はどうなるのでしょうか。

CSS

.third {
  color : red;
}
#second {
  color : green;
}
.first p {
  color: blue;
}

f:id:nonaka-katuma-hal:20171121174937j:plain

ということで idセレクタが優先されます

6. 要素を特定したidセレクタとidセレクタ

最後に要素を特定したidセレクタとidセレクタを比べてみます

CSS

#second {
  color : green;
}
p#second {
    color : yellow;
}

f:id:nonaka-katuma-hal:20171121180241j:plain

要素を特定したidセレクタが優先されます

7.まとめ

優先度についてまとめますと

要素を特定したidセレクタ > idセレクタ > 親要素+タイプセレクタ > 要素を特定したclassセレクタ > classセレクタ > タイプセレクタ

となります。

MySQLのREPLACEについて

MySQLでREPLACEの使い方等について覚えたので記載いたします。 REPLACEはレコードに登録してある文字列や数値を置換したい時に使います。

書き方は以下のようになります。

UPDATE テーブル名 SET カラム名=REPLACE(カラム名, '置換前', '置換後') WHERE id=X;

実際に試してみます。以下の様なcustomersテーブルがあります。 f:id:nonaka-katuma-hal:20171116172500j:plain

UPDATE customers SET name=REPLACE(name, 'a', 'b') where id = 1;

id 1のname であるabcdのaをbに置換します。

f:id:nonaka-katuma-hal:20171116172618j:plain

id1 の abcd が bbcdに置換されています。

レコード全てを置換するなら where id = 1を削れば良いです。

UPDATE customers SET name=REPLACE(name, 'a', 'b');

f:id:nonaka-katuma-hal:20171116172950j:plain

レコードのaは全てbに置換されています。

こちら数値でも置換することができます。

f:id:nonaka-katuma-hal:20171116173410j:plain

testの1を5に置換します。

UPDATE customers SET test=REPLACE(test, '1', '5');

f:id:nonaka-katuma-hal:20171116173532j:plain

以下のサイトを参考にしました。

MySQLで一括置換をかける - Qiita

以上になります。

gitでリモートのブランチをチェックアウトできずにつまずいたとき

gitを使ったチーム開発で問題が起こりました。開発の手順は以下のようになります。

  1. リモートのブランチ[A]をローカルにチェックアウトする
  2. ローカルに作業用ブランチ[B]を作る、制作をする、時が流れる
  3. ローカルのブランチ[A]が古くなっていて諸事情によりローカルブランチ[A]を削除する
  4. 再度[A]をリモートからチェックアウトする
  5. ローカルブランチ[A]で作業用ブランチ[B]をマージする
  6. ローカルブランチ[A]をリモートブランチ[A]にpushする

4の段階でチェックアウトしてきたローカルブランチ[A]とリモートブランチ[A]を比較した際にかなりの相違が見られました。 つまり最新の[A]をローカルにチェックアウトできていませんでした。

行ったコマンドは以下のようになります。

1. リモートのブランチ[A]をローカルにチェックアウトする

$git checkout [A] origin/[A]

ローカルにブランチ[A]ができます。

2.ローカルに作業用ブランチ[B]を作る、制作をする

git branch [B]

ブランチ[B]で作業をします

3. ローカルのブランチ[A]が古くなっているのでローカルブランチ[A]を削除する

$git branch -D [A]

ブランチ [A]が消えます

4.再度[A]をリモートからチェックアウトする

$git checkout [A] origin/[A]

ここで最新の[A]をローカルに入れたかったのですがなぜか内容が古い、、、 1の時は最新の状態にすることが出来たのですが

解決方法

どうやらローカルのリポジトリを更新する必要があるということで

$git fetch

をしました。これはローカルの情報が古ければ、リポジトリ情報がダウンロードされ更新されます。

5. ローカルブランチ[A]で作業用ブランチ[B]をマージする

$git merge [B]

で[B]の作業内容をマージします。

ここでpushする前に本当にリモートにpushしていいか一度確認しましょう。

まずはローカルとリモートにある全てのブランチを表示します。

$git branch -a

とすると remotes/origin/[A] といった感じでリモートのブランチが確認できると思うので ローカルの現在いるブランチとリモートのブランチの差分を表示します。

git diff remotes/origin/[A]

これで差分が作業した内容のみになっていれば大丈夫です。

6. ローカルブランチ[A]をリモートブランチ[A]にpushする

$git push origin [A]

これで作業内容をリモートに反映させることが出来ます。

以下のサイトを参考にしました。

git fetchの理解からgit mergeとpullの役割 - Qiita

GitHub にアップされているブランチをローカルに取り込む