MW211 EXIT

devlog
PHP配列/特定列の重複を抽出
2021年10月21日
┌──────────────────────────────────────┐
│$hash = [                                                                   │
│    ['id' => 'a', 'data' => 'x'],                                           │
│    ['id' => 'b', 'data' => 'y'],                                           │
│    ['id' => 'a', 'data' => 'z'],                                           │
│];                                                                          │
└──────────────────────────────────────┘
上記のような二次元連想配列があり、特定の列(今回は'id')が重複している場合
それを一次元配列に抽出する方法。

以下のような感じ
┌──────────────────────────────────────┐
│$duplicates = array_keys(                                                   │
│                  array_filter(                                             │
│                      array_count_values(                                   │
│                          array_column($hash, 'id')                         │
│                      ),                                                    │
│                      function($value) {return ($value > 1);}               │
│                  )                                                         │
│              );                                                            │
└──────────────────────────────────────┘
分類:PHP配列
PHP配列/すべての要素に同じ処理
2017年06月19日
例えば、(一次元)配列の要素全てを数値変換する場合には、
foreach文を使って以下のように処理する。
┌──────────────────────────────────────┐
│foreach ($配列 as &$value) {                                                │
│    $value = intval($value);                                                │
│}                                                                           │
└──────────────────────────────────────┘
array_map()を使うともっとシンプルに書ける
┌──────────────────────────────────────┐
│$配列 = array_map(function($value) {return intval($value);}, $配列);        │
└──────────────────────────────────────┘
分類:PHP配列
PHP配列/添字配列を連想配列に変換
2017年02月14日
添字配列から、keyとvalueが同じ連想配列を生成するスマートな方法。
「array_combine()」を用いる。(第一引数がkeyに第二引数がvalueになる)
┌──────────────────────────────────────┐
│$a = [                                                  ┌────────┐│
│    'a',                                                │array(3) {      ││
│    'b',                                                │  ["a"]=>       ││
│    'c',                                                │  string(1) "a" ││
│];                                                      │  ["b"]=>       ││
│$aa = array_combine($a, $a);                            │  string(1) "b" ││
│var_dump($aa);  //──────────────────→│  ["c"]=>       ││
└────────────────────────────│  string(1) "c" │┘
                                                          │}               │
                                                          └────────┘
なお、添字配列内に重複したデータがあった場合には、
重複分は無視される(一つにまとめられる)。

もっと、他にスマートな方法がありそうだが。
分類:PHP配列
PHP配列/var_export()
2014年04月10日
PHPの配列は以下のような感じで定義する訳だが、
┌──────────────────────────────────────┐
│$配列 = array (                                                             │
│    キー => 値,                                                             │
│    内部配列 => array (                                                     │
│        0 => array (                                                        │
│            キー => 値,                                                     │
│        ),                                                                  │
│    ),                                                                      │
│);                                                                          │
└──────────────────────────────────────┘
定義後の「$配列」から、右辺を再現する方法がある。
「var_export($配列);」だ。

第二引数に、「TRUE」を付ければ、標準出力ではなく、左辺に代入もできる。
┌──────────────────────────────────────┐
│$文字列 = var_export($配列, TRUE);                                          │
└──────────────────────────────────────┘

で、これを配列に復元させるには…、コピペしてソースに貼り付ければいい。
ってな、冗談はさておき、といってもこれが結構実用的だったりする。

プログラム的に復元するには、「eval()」を使うことになる。
(ソースにコピペしたような挙動をしてくれる便利な関数だ)

一連の流れをまとめると以下のような形となる。
┌──────────────────────────────────────┐
│$文字列 = var_export($配列, TRUE);                                          │
│$配列 = var_import($文字列);                                                │
├──────────────────────────────────────┤
│function var_import($string) {                                              │
│    eval('$array=' . $string . ';');                                        │
│    return $array;                                                          │
│}                                                                           │
└──────────────────────────────────────┘
但し、「eval()」は万能過ぎるので、致命的なこと(例えばファイル削除)を
意図せずして行われる危険性を伴う(SQLインジェクションみたいな感じで)。

なので、あまり、使わない方がいいようだ。
ってことで、「var_export()」は手動コピペと共にってのが上手な付き合い方かも。
分類:PHP配列
PHP配列/特定の列の調査
2014年04月08日
下記のようなSQL文で取得した複数行データのような多次元連想配列があったとして。
┌──────────────────────────────────────┐
│$多次元連想配列 = array(                                                    │
│    array(                                                                  │
│        キー   => 値,                                                       │
│        データ => 値,                                                       │
│    ),                                                                      │
│    array(                                                                  │
│        キー   => 値,                                                       │
│        データ => 値,                                                       │
│    ),                                                                      │
│);                                                                          │
└──────────────────────────────────────┘

列を縦に切り出して配列化するのは「array_column()」を使う。
┌──────────────────────────────────────┐
│キーの配列 = array_column($多次元連想配列, キー);                           │
└──────────────────────────────────────┘

これを使って、特定の列の最大値を求めることもできる。
┌──────────────────────────────────────┐
│列の最大値 = max(array_column($多次元連想配列, 列));                        │
└──────────────────────────────────────┘

といっても、「array_column()」を使えるのは「PHP5.5以降」でのこと。

「mb_strwidth()」を駆使すれば、列の最大幅を調査することもできる。
┌──────────────────────────────────────┐
│列の最大幅 = max(array_map(function($value) {return mb_strwidth($value);},  │
│                           array_column($多次元連想配列, 列)));             │
└──────────────────────────────────────┘
但し、「mb_strwidth()」にはややこしい問題があるので注意
#UTF-8では「①」が半角扱いになるなど
分類:PHP配列
PHP配列/改造array_diff()
2013年11月30日
配列['a', 'b', 'b']と配列['b']の差分を比較したい場合。

「array_diff(array('a', 'b', 'b'), array('b'))」ってやると
結果が、配列['a']のみとなってしまう。

要素が複数ある場合には、その数に応じて差分を取りたいという場合
つまり、結果が配列['a', 'b']であって欲しい場合には「array_diff()」は使えない。

ということで、自前でそれを実現する関数を作ってみた
┌──────────────────────────────────────┐
│function array_diff2($return, $delete) {                                    │
│    if (is_array($return) && is_array($delete)) {                           │
│        foreach ($delete as $data1) {                                       │
│            foreach ($return as $key2 => $data2) {                          │
│                if ($data2 === $data1) {                                    │
│                    unset($return[$key2]);                                  │
│                    break;                                                  │
│                }                                                           │
│            }                                                               │
│        }                                                                   │
│    }                                                                       │
│    return $return;                                                         │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP配列
PHP配列/配列が全て空であることの判定
2013年08月28日
全ての要素が、FALSE相当(FALSE、NULL、0、'0'、''、array())の場合に検出。
┌──────────────────────────────────────┐
│$empty = array_filter($配列);                                               │
│if (empty($empty)) {                                                        │
│    return '全て空です';                                                    │
│} else {                                                                    │
│    return '空ではありません';                                              │
│}                                                                           │
└──────────────────────────────────────┘

全ての要素が、空文字相当(FALSE、NULL、'')の場合に検出。
┌──────────────────────────────────────┐
│$empty = array_filter($配列, 'strlen');                                     │
│if (empty($empty)) {                                                        │
│    return '全て空です';                                                    │
│} else {                                                                    │
│    return '空ではありません';                                              │
│}                                                                           │
└──────────────────────────────────────┘
なお、要素が(子)配列(array())の場合はエラーとなるので注意。
分類:PHP配列
PHP配列/先頭から二件取得
2012年09月28日
連想配列の先頭から一件のキーを取得したい場合は、以下が使える。
┌──────────────────────────────────────┐
│@reset(array_keys($配列));                                                  │
└──────────────────────────────────────┘

では、二件の場合は?
上記を二個並べて無理。(一件目が二つ取得できるだけ)

だまって、二件抽出した方がよさそうだ。
┌──────────────────────────────────────┐
│$a = array_slice(array_keys($配列), 0, 2);                                  │
│$一件目 = $a[0];                                                            │
│$二件目 = $a[1];                                                            │
└──────────────────────────────────────┘
分類:PHP配列
PHP配列/先頭と末尾を取得(3)
2012年09月09日
あれ?よくよく考えると、やりたいことは元の配列に傷をつけずに、
先頭もしくは末尾のデータを取得すること。

これだけでよかった…んだね。

先頭データの値を取得する。
┌──────────────────────────────────────┐
│array_shift($配列);                                                         │
└──────────────────────────────────────┘
  ↓
┌──────────────────────────────────────┐
│reset($配列);                                                               │
└──────────────────────────────────────┘
末尾データの値を取得する。
┌──────────────────────────────────────┐
│array_pop($配列);                                                           │
└──────────────────────────────────────┘
  ↓
┌──────────────────────────────────────┐
│end($配列);                                                                 │
└──────────────────────────────────────┘
分類:PHP配列
PHP配列/先頭と末尾を取得(2)
2012年09月08日
前回の応用で、array_values()を使っても値が取得できる。
また、array_keys()を使えばキーまで取得できる。

先頭データのキーを取得する。
┌──────────────────────────────────────┐
│@array_shift(array_keys($配列));                                            │
├──────────────────────────────────────┤
│@reset(array_keys($配列));                                                  │
└──────────────────────────────────────┘
先頭データの値を取得する。
┌──────────────────────────────────────┐
│@array_shift(array_values($配列));                                          │
├──────────────────────────────────────┤
│@reset(array_values($配列));                                                │
└──────────────────────────────────────┘
末尾データのキーを取得する。
┌──────────────────────────────────────┐
│@array_pop(array_keys($配列));                                              │
├──────────────────────────────────────┤
│@end(array_keys($配列));                                                    │
└──────────────────────────────────────┘
末尾データの値を取得する。
┌──────────────────────────────────────┐
│@array_pop(array_values($配列));                                            │
├──────────────────────────────────────┤
│@end(array_values($配列));                                                  │
└──────────────────────────────────────┘

ワーニングが出るんで「@」も忘れずに。
分類:PHP配列
前へ 1 2 3 次へ