配列の応用

一次元配列⇒二次元配列の展開と配列の応用例です。

ステップ-1

一次元配列の文字列をカンマで切り分けて、二次元配列に展開します。
ソースコードを Shift-JIS でタイプして c:\DATA\PHP\ に格納して下さい。
<?php
    $ar = array(  "ばなな,好き,果物,安い,,輸入",
                  "いちご,国産,,好き,野菜,",
                  "ぶどう,好き,国産,,果物,高い",
                  "りんご,果物,,嫌い,安い,国産",
                  "みかん,,好き,安い,国産,果物" );
    // 二次元配列 $ar2 に展開
    for($i=0; $i<count($ar); $i++)
    {   $aw = explode(",", $ar[$i]);
        $ar2[$i]= $aw;
    }
    print_r($ar2);
    $ix1= count($ar2);
    $ix2= count($ar2[0]);
    print('$ar2 のサイズ='."[$ix1, $ix2]\n");
?>

【実行画面】
C:\DATA\PHP>php array_comp.php
Array
(
    [0] => Array
        (
            [0] => ばなな
            [1] => 好き
            [2] => 果物
            [3] => 安い
            [4] =>
            [5] => 輸入
        )

    [1] => Array
        (
            [0] => いちご
            [1] => 国産
            [2] =>
            [3] => 好き
            [4] => 野菜
            [5] =>
        )

    [2] => Array
        (
            [0] => ぶどう
            [1] => 好き
            [2] => 国産
            [3] =>
            [4] => 果物
            [5] => 高い
        )

    [3] => Array
        (
            [0] => りんご
            [1] => 果物
            [2] =>
            [3] => 嫌い
            [4] => 安い
            [5] => 国産
        )

    [4] => Array
        (
            [0] => みかん
            [1] =>
            [2] => 好き
            [3] => 安い
            [4] => 国産
            [5] => 果物
        )

)
$ar2 のサイズ=[5, 6]
C:\DATA\PHP>

プログラムの説明

  1. 配列で文字列を定義します。
        $ar = array(  "ばなな,好き,果物,安い,,輸入",
                      "いちご,国産,,好き,野菜,",
                      "ぶどう,好き,国産,,果物,高い",
                      "りんご,果物,,嫌い,安い,国産",
                      "みかん,,好き,安い,国産,果物" );
    
  2. 配列 $ar をカンマで切り分けて二次元配列に展開します。
    explode(",", $ar[$i]); がカンマで切り分ける関数で、$ar2 が二次元配列です。
        for($i=0; $i<count($ar); $i++)
        {   $aw = explode(",", $ar[$i]);
            $ar2[$i]= $aw;
        }
    
  3. print_r($ar2); で二次元配列を印字します。
    $ix1, $ix2 が配列の大きさです。
        print_r($ar2);
        $ix1= count($ar2);
        $ix2= count($ar2[0]);
        print('$ar2 のサイズ='."[$ix1, $ix2]\n");
    

ステップ-2

二次元配列の類似点を見つけて $cnt にカウントします。
    for($i=0; $i<$ix1; $i++)
    {   $cnt[$i] = 0;
        for($j=1; $j<$ix2; $j++)
        {   for($k=1; $k<$ix2; $k++)
            {   if ($ar2[0][$j]!="" && $ar2[0][$j]==$ar2[$i][$k])  $cnt[$i]++;
            }
        }
    }
    print "$cnt に類似点をカウント\n";
    print_r($cnt);

【実行画面】
C:\DATA\PHP>php array_comp.php
Array に類似点をカウント
Array
(
    [0] => 4
    [1] => 1
    [2] => 2
    [3] => 2
    [4] => 3
)

プログラムの説明

  1. "ばなな"の配列を基本として、類似点が幾つあるか数えます。
    果物の名前と空の項目を除いて、類似点を $cnt にカウントします。
  2. 類似点は順不同で調べるので、for($k=1; $k<$ix2; $k++) でループします。
    if ($ar2[0][$j]!="" && $ar2[0][$j]==$ar2[$i][$k]) で類似点を判定します。
  3. print_r($cnt); でカウンタ $cnt を印字します。

ステップ-3

類似点が多い順に印字します。
    arsort($cnt);
    reset($cnt);
    for($i=0; $i<$ix1; $i++)
    {   $k= key($cnt);
        $aw= $ar2[$k];
        print "評価点= $cnt[$k] \n";
        print_r($aw);
        next($cnt);
    }

【実行画面】
評価点= 4
Array
(
    [0] => ばなな
    [1] => 好き
    [2] => 果物
    [3] => 安い
    [4] =>
    [5] => 輸入
)
評価点= 3
Array
(
    [0] => みかん
    [1] =>
    [2] => 好き
    [3] => 安い
    [4] => 国産
    [5] => 果物
)
評価点= 2
Array
(
    [0] => りんご
    [1] => 果物
    [2] =>
    [3] => 嫌い
    [4] => 安い
    [5] => 国産
)
評価点= 2
Array
(
    [0] => ぶどう
    [1] => 好き
    [2] => 国産
    [3] =>
    [4] => 果物
    [5] => 高い
)
評価点= 1
Array
(
    [0] => いちご
    [1] => 国産
    [2] =>
    [3] => 好き
    [4] => 野菜
    [5] =>
)

プログラムの説明

  1. arsort($cnt); で大きい順にソートします。
  2. reset($cnt); で最初に戻します。
  3. $k= key($cnt); でキーを取得して、$aw= $ar2[$k]; で大きい順に配列を取得します。
  4. print "評価点= $cnt[$k] \n"; で類似点を印字します。
  5. print_r($aw); で配列を印字します。
  6. next($cnt); で $cnt を次に設定します。

前田稔の超初心者のプログラム入門
PHP Program