Archives by date

You are browsing the site archives by date.

【CakePHP2.4】SessionComponent::setFlash()でエレメントを使う。

めも。

まず「app/View/Elements/」以下に好きなエレメントを作成する。

そしてコントローラーでsetFlash()をする際、下記のようにエレメントを呼び出す。

1
2
// elementFileName.ctpというエレメントを作成したと仮定する
$this->Session->setFlash('メッセージ', 'elementFileName');

これで作成したエレメントが呼び出される。

エレメント内では$messageに第一引数で渡したメッセージが格納されているので、任意の場所でechoしてやればよい。

 

【PHP】配列で二つの値が共に重複しない新規配列を返す関数。

必要だったので自作。

例えば以下のような配列があったとする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$array = array(
    0 => array(
        'name' => 'tarou',
        'age' => '17',
    ),
    1 => array(
        'name' => 'tarou',
        'age' => '19',
    ),
    2 => array(
        'name' => 'tarou',
        'age' => '17',
    ),
    3 => array(
        'name' => 'hanako',
        'age' => '15',
    ),
    4 => array(
        'name' => 'alice',
        'age' => '20',
    ),
    5 => array(
        'name' => 'bob',
        'age' => '17',
    ),
    6 => array(
        'name' => 'alice',
        'age' => '20',
    ),
    7 => array(
        'name' => 'bob',
        'age' => '17',
    ),
    8 => array(
        'name' => 'tarou',
        'age' => '19',
    ),
);

ここで配列中のnameとageが共に重複するレコードのみ取り除きたい。
というわけで下記関数を用意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function array_pair_unique($array, $one, $two) {
    $first = reset($array);
    if(!array_key_exists($one, $first) || !array_key_exists($two, $first) ) {
        return $array;
    }
    $tmp = array();
    $return = array();
    foreach($array as $k => $v) {
        if(array_key_exists($v[$one], $tmp) && in_array($v[$two], $tmp[$v[$one]])) {
            continue;      
        } else {
            $tmp[$v[$one]][] = $v[$two];
            $return[$k] = $v;
        }
    }
    return $return;
}

上記関数を以下のようにして用いる。

1
$array = array_pair_unique($array, 'name', 'age');

すると下記のような結果が返る。見事に思惑通り。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
array(5) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "tarou"
    ["age"]=>
    string(2) "17"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(5) "tarou"
    ["age"]=>
    string(2) "19"
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(6) "hanako"
    ["age"]=>
    string(2) "15"
  }
  [4]=>
  array(2) {
    ["name"]=>
    string(5) "alice"
    ["age"]=>
    string(2) "20"
  }
  [5]=>
  array(2) {
    ["name"]=>
    string(3) "bob"
    ["age"]=>
    string(2) "17"
  }
}

元配列のキーは保持され、重複したレコードがある場合はその中で一番最初にヒットしたもがセットされる。
関数を呼び出す際に存在しないキー名が渡された場合、元配列をそのまま返却するようにしてみた。