質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.60%

  • PHP

    19862questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

phpで多次元配列を作成して、効率よくURLスラッグとマッチした配列を取得するためには

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 241

holic

score 83

前提・実現したいこと

下記にphpのソースを記載しました。
・$slickThumbという配列に商品情報を記載していってます。
・サイトアドレスがexample.com/collect/polo/mink/のURLのときは
$url_second="polo"
$url_third="mink"
がセットされる仕組みを作っております。
ちなみに$url_secondはbrand名を、$url_thirdはgoods名を示します。

【問題点】
各々のページ例えばexample.com/collect/polo/mink/のページに行った際に
第二スラッグのpoloと
第三スラッグのminkをトリガーにして$slickThumbの配列から探し出したいのです。
ソースの『//現在のページの情報所得』のところのfor文で全ての配列を確認して対応する配列を探し出していますが、効率的ではないと考えております。(その都度loopを回すのも負荷的に良くないのかとも思いました)
多次元配列の書き方も含めてもっと効率の良い、書き方ありますでしょうか。

phpに詳しいお方がいらっしゃいましたらお手数ですがご教示願います。

//slickhtumbの基本情報入力

<?php
//urlの取得
function my_url(){
    $str = str_replace("/wp/", "/", $_SERVER["REQUEST_URI"]); 
    $my_url['url'] = $str;
    $my_url['url'] = substr_replace($my_url['url'], "", 0,1);//一文字目の/を削除
    $my_url['path'] = explode("/", $my_url['url']);
    $my_url['url'] = "/".$my_url['url'];//一応/をいれておく。
    return $my_url;
}

$url = my_url();
$url_second = isset($url['path'][1]) ? $url['path'][1] : NULL ;
$url_third = isset($url['path'][2]) ? $url['path'][2] : NULL ;

//$slickThumb[] = array(
//'brand_slug'=>'-2ndスラッグ名',
//'goods_slug'=>'3rdスラッグ名',
//'list'      =>'リスト要素'
//);

//ブランド:polo
$slickThumb[0] = array(
    'brand_slug' =>    'polo',
    'goods_slug' =>    'mink',
    'list'     =>    '<li>ミンクポロ</li>'
    );
$slickThumb[1] = array(
    'brand_slug' =>    'polo',
    'goods_slug' =>    'flat',
    'list'     =>    '<li>フラットポロ</li>'
    );
$slickThumb[2] = array(
    'brand_slug' =>    'polo',
    'goods_slug' =>    'rabbitfur',
    'list'     =>    '<li>ラビットポロ</li>'
    );

  //ブランド:racoste
$slickThumb[3] = array(
    'brand_slug' =>    'racoste',
    'goods_slug' =>    'ballet',
    'list'     =>    '<li>バレットラコステ</li>'
    );
$slickThumb[4] = array(
    'brand_slug' =>    'racoste',
    'goods_slug' =>    'feather',
    'list'     =>    '<li>フェザーラコステ</li>'
    );



//現在のページの情報所得
for($i=0;$i<count($slickThumb);$i++){
    if(($slickThumb[$i]['brand_slug'] == $url_second) && ($slickThumb[$i]['goods_slug'] == $url_third)):
        $HereNumber = $i;
    endif;
}

?>

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2017/09/19 16:35

    ありがとうございます。ところでURLからするとWordpressが何か関係しているのでしょうか?要件次第ではWordpressもタグに追加されたほうがより的確な回答を得られるかもしれません。

    キャンセル

  • holic

    2017/09/19 16:55

    ご指摘ありがとうございます。wordpress内で構築している記述を抜粋して記事を投稿しました。ソースの中にwordpressのタグが入っていたら、タグに『wordpress』を入れようと思ったり、純粋にphpだけだからなーと思ったりして、迷ったあげく『php』だけにしました。やはりそれでもつけた方がよいのでしょうかね。

    キャンセル

  • holic

    2017/09/19 16:56

    どちらかというとテラテイルの運用方法の質問になってしまい失礼します

    キャンセル

回答 2

checkベストアンサー

+1

こういうことでしょうか。

// PHP5.4+
$slickThumb = [
    'mink' => [
      'brand_slug' =>    'polo',
      'list'     =>    'ミンクポロ'
    ],
    'flat' => [
      'brand_slug' =>    'polo',
      'list'     =>    'フラットポロ'
    ],
    'rabbitfur' => [
      'brand_slug' =>    'polo',
      'list'     =>    'ラビットポロ'
    ],
    'ballet' => [
      'brand_slug' =>    'racoste',
      'list'     =>    'バレットラコステ'
    ],
    'feather' => [
      'brand_slug' =>    'racoste',
      'list'     =>    'フェザーラコステ'
    ]
];
if ( isset( $slickThumb[ $url_third ] ) && $slickThumb[ $url_third ]['goods_slug'] === $url_second) ) {
    // in
} else {
    // not in
}

追記:

// PHP5.4+
$slickThumb = [
    'mink-polo' => [
      'goods_slug' =>    'mink',
      'brand_slug' =>    'polo',
      'list'     =>    'ミンクポロ'
    ],
    'flat-polo' => [
      'goods_slug' =>    'flat',
      'brand_slug' =>    'polo',
      'list'     =>    'フラットポロ'
    ],
    'rabbitfur-polo' => [
      'goods_slug' =>    'rabbitfur',
      'brand_slug' =>    'polo',
      'list'     =>    'ラビットポロ'
    ],
    'ballet-racoste' => [
      'goods_slug' =>    'ballet',
      'brand_slug' =>    'racoste',
      'list'     =>    'バレットラコステ'
    ],
    'feather-racoste' => [
      'goods_slug' =>    'feather',
      'brand_slug' =>    'racoste',
      'list'     =>    'フェザーラコステ'
    ]
];
if ( isset( $slickThumb[ $url_third.'-'.$url_second ] ) ) {
    // in
} else {
    // not in
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/19 18:20 編集

    コンパクトに纏めていただきましてありがとうございます。

    一点お伝えし忘れていたことがあります。五商品のgoods名が現在はユニーク値になっておりますが、今後商品が増えていった際にgoods名が同じものも出てきます、ただしbrand名は絶対に異なります。

    ですのでgoods名とbrand名の二つチェックで始めユニークな配列の格納されている場所がわかりると思っております。
    (申し訳ありません💦)

    キャンセル

  • 2017/09/19 18:29

    WordPressは仕様的にスラッグの重複ができないので、ユニーク値になると思いますよ。

    キャンセル

  • 2017/09/19 18:56

    kei344さんありがとうございます。ベストアンサーとさせていただきます

    キャンセル

+1

こんにちは。
既に回答されている方と同じですが、ループをやめたいのであれば
ブランド、商品を配列のkeyにするのがいいと思います。

<?php
//slickhtumbの基本情報入力

//urlの取得
function my_url(){
    $str = str_replace("/wp/", "/", $_SERVER["REQUEST_URI"]); 
    $my_url['url'] = $str;
    $my_url['url'] = substr_replace($my_url['url'], "", 0,1);//一文字目の/を削除
    $my_url['path'] = explode("/", $my_url['url']);
    $my_url['url'] = "/".$my_url['url'];//一応/をいれておく。
    return $my_url;
}

$url = my_url();
$url_second = isset($url['path'][1]) ? $url['path'][1] : NULL ;
$url_third = isset($url['path'][2]) ? $url['path'][2] : NULL ;

//$slickThumb[] = array(
//'brand_slug'=>'-2ndスラッグ名',
//'goods_slug'=>'3rdスラッグ名',
//'list'      =>'リスト要素'
//);

//ブランド:polo
$slickThumb = array(
    'polo' => array (
        'mink'      => '<li>ミンクポロ</li>',
        'flat'      => '<li>フラットポロ</li>',
        'rabbitfur' => '<li>ラビットポロ</li>',
    ),
    'racoste' => array (
        'ballet'  => '<li>バレットラコステ</li>',
        'feather' => '<li>フェザーラコステ</li>'
    )
);

//現在のページの情報所得
if (isset($slickThumb[$url_second][$url_third])) {
    echo $slickThumb[$url_second][$url_third];
} else {
    echo "Item not found";
}

ただ、商品が増える度にソースコードに手を入れないといけなくなりますので、
個人的には、DBに商品情報を入れて取得する形が良いかなと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/19 19:01

    ご解答ありがとうございます。
    おっしゃるとおりDB上で管理する方が私も良いと思いました。
    別解答も考えていただきましてありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19862questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • トップ
  • PHPに関する質問
  • phpで多次元配列を作成して、効率よくURLスラッグとマッチした配列を取得するためには