PHPで多次元配列から指定のキー(添え字)を削除したい場合

PHPで配列から指定したキー(添え字)に紐づく要素を取り除きたい場合。

ちょっと調べてみたけど、標準関数では多次元配列などに
対応してる関数が見つからなかった。

仕方ないから作ってみた。

多次元配列から、複数のキーに紐づく要素の削除処理。

ざくっと書いて動かしてみたけど、多分大丈夫っぽい。

不具合あったら修正します。


/**
* 多次元配列から、指定されたKEYを含む要素を削除して返す
* @param array $search_array 処理対象の配列
* @param array $del_keys 削除するKeyの配列。例(0=>'id', 1=>'name')
* @return array $search_array 削除後の配列
*/
function deleteKeyFromArray($search_array = array(), $del_keys = null) {

  //パラメータのどちらかが空なら処理なし
  if (empty($search_array) || empty($del_keys)) {
    return $search_array;
  }

  foreach($search_array as $key => $val) {
    //指定キー以外の要素を取得
    $search_array[$key] = array_diff_key($val, array_flip($del_keys));
    //多次元配列チェック
    foreach($val as $key2 => $val2) {
      if(is_array($val2)) {
        //要素が配列なら再帰処理
        $search_array[$key] = $this->deleteKeyFromArray($val, $del_keys);
      }
    }
  }

  return $search_array;
}
  

PHPでの日付文字列のフォーマット変換や年月日の抽出方法

ちょっと知らなかった関数を見つけたので忘れる前に記述。

$hoge = '2012-2-20';

上記のような変数があるとする。

この変数を元に以下のような事をしたい場合の話。

1.フォーマットの変換
 ⇒ 月と日の部分を2桁に揃えたい
 ⇒ 区切り文字をハイフンからスラッシュに変更したい
2.部分抽出
 ⇒ 年月の部分をそれぞれ別々の変数に格納したい

1は以下の記述で2つとも対応可能
$hoge = vsprintf("%d/%02d/%02d", sscanf($hoge, "%d-%d-%d"));

2は下記の記述でOK
sscanf($hoge, "%d-%d", $year, $month);
⇒ $year : 2012
⇒ $month : 2

以上。  

Group Byしている時にpaginatorが正常に機能しない件の対策

CakePHPでpaginateを使う際、groupのオプションを指定すると、
ページングや総件数の表示がおかしくなった。

基本的には、aroundthedistanceさんの以下のブログで対応可能。

Group Byしている時にpaginator->number()が表示されない件
http://d.hatena.ne.jp/aroundthedistance/20090728/1248784179

ただ、これだと、Controller側でpaginateに渡したrecursiveが
beforeFindで拾えなくなってました。

適当に変更して以下のように対応。


/**
* app/models/app_model.php
*/

function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
    $parameters = compact('conditions');
    if ($recursive != $this->recursive) {
        $parameters['recursive'] = $recursive;
    }
    $count = $this->find('count', array_merge($parameters, $extra));
    if (isset($extra['group'])) {
        $count = $this->getAffectedRows();
    }
    return $count;
}


以上。

    if ($recursive != $this->recursive) {
        $parameters['recursive'] = $recursive;
    }
の部分、if文がいらなく思えて仕方ないけど、何か理由があるんだろうと放置。

CakePHP1.3  

XSS対策

自社サイトがXSS対策をしていないことが判明。


■XSSとは?
XSS 【Cross Site Scripting】(クロスサイトスクリプティング)

ソフトウェアのセキュリティホールの一つで、
Webサイトの訪問者の入力をそのまま画面に表示する掲示板などのプログラムが、
悪意のあるコードを訪問者のブラウザに送ってしまう脆弱性のこと。

※参考サイト:http://e-words.jp/w/XSS.html


■対策法
受け取った入力を表示する箇所すべてに
htmlspecialchars()
を使うだけでOK。

使用例) < ?php echo htmlspecialchars($str); ?>
※< と ? を続けて記載すると表示出来ない為、空白を入れてあります。

タグの属性値を「'」で括っている場合、htmlspecialchars() の第2引数に
ENT_QUOTES を入れておく必要があり、第3引数で文字コードを指定することも可能。


使用例) < ?php echo htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ); ?>

毎回上記の記載をするとソースが見にくくなるため、
下記のような関数を定義して上げると良い。


< ?php
function echo_html( $str )
{
echo htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' );
}
?>
< ?php echo_html( $hogehoge ) ?>

※参考サイト:http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html


■補足
なお、CakePHPの場合、
htmlspecialchars()は短縮してh()と書くことが可能。

その場合、第2、第3引数は要らなくなります。

使用例)< ?php echo h($str) ?>

※参考サイト:http://unimakura.jp/php/cakephphtmlspecialcharsh.html  

EXCEL2007でユーザー名が正しく表示されない

ブログ最初の投稿は備忘録から。

EXCEL2007の使用ユーザーが正しく表示されない件に関して。


社内で共有フォルダにEXCELを入れ、
みんなでそのファイルを使用しているわけだが、
どういうわけか少し前から誰が開いていても使用ユーザー名が
「そのほかのユーザー」と表示されてしまうようになっていた。

ネットで調べても特に原因は判明せず。

同じ疑問点を教えてgooで質問している人もいたが、回答は付いていなかった。


で、ふとした考えが浮かんで試した見たところ、無事問題解決。

以前のように使用者のユーザー名がちゃんと表示されるようになった。

解決策は、EXCEL2007で新しく取り入れられた形式「xlsx」から
従来の「xls」形式に変更して保存するだけ。


う~ん・・・

xlsx形式だと、何かしら不都合が多いなぁ。

昔のEXCELのバージョンしか持ってない人にxlsx形式で渡してしまうと
普通に開けないし。

そのくせ、EXCEL2007で保存する際の標準保存形式に指定されている。

マイクロソフトは微妙に不親切だなぁ、と時々思う。


上記の方法はスマートじゃないので、
他に、使用ユーザー名を正しく表示できる方法を知ってる方がいましたら教えてくださいませ。