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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

2回答

1528閲覧

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

holic

総合スコア134

PHP

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

0グッド

0クリップ

投稿2017/09/19 06:22

編集2017/09/19 07:02

###前提・実現したいこと
下記に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に詳しいお方がいらっしゃいましたらお手数ですがご教示願います。

php

1//slickhtumbの基本情報入力 2 3<?php 4//urlの取得 5function my_url(){ 6 $str = str_replace("/wp/", "/", $_SERVER["REQUEST_URI"]); 7 $my_url['url'] = $str; 8 $my_url['url'] = substr_replace($my_url['url'], "", 0,1);//一文字目の/を削除 9 $my_url['path'] = explode("/", $my_url['url']); 10 $my_url['url'] = "/".$my_url['url'];//一応/をいれておく。 11 return $my_url; 12} 13 14$url = my_url(); 15$url_second = isset($url['path'][1]) ? $url['path'][1] : NULL ; 16$url_third = isset($url['path'][2]) ? $url['path'][2] : NULL ; 17 18//$slickThumb[] = array( 19//'brand_slug'=>'-2ndスラッグ名', 20//'goods_slug'=>'3rdスラッグ名', 21//'list' =>'リスト要素' 22//); 23 24//ブランド:polo 25$slickThumb[0] = array( 26 'brand_slug' => 'polo', 27 'goods_slug' => 'mink', 28 'list' => '<li>ミンクポロ</li>' 29 ); 30$slickThumb[1] = array( 31 'brand_slug' => 'polo', 32 'goods_slug' => 'flat', 33 'list' => '<li>フラットポロ</li>' 34 ); 35$slickThumb[2] = array( 36 'brand_slug' => 'polo', 37 'goods_slug' => 'rabbitfur', 38 'list' => '<li>ラビットポロ</li>' 39 ); 40 41 //ブランド:racoste 42$slickThumb[3] = array( 43 'brand_slug' => 'racoste', 44 'goods_slug' => 'ballet', 45 'list' => '<li>バレットラコステ</li>' 46 ); 47$slickThumb[4] = array( 48 'brand_slug' => 'racoste', 49 'goods_slug' => 'feather', 50 'list' => '<li>フェザーラコステ</li>' 51 ); 52 53 54 55//現在のページの情報所得 56for($i=0;$i<count($slickThumb);$i++){ 57 if(($slickThumb[$i]['brand_slug'] == $url_second) && ($slickThumb[$i]['goods_slug'] == $url_third)): 58 $HereNumber = $i; 59 endif; 60} 61 62?>

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/09/19 06:29

my_url()はどのような処理を行っているのでしょうか。コード内容の追記をお願いします。
holic

2017/09/19 07:03

お手数おかけいたします、書き足りなくて申し訳ございませんでした。追記しました。
m.ts10806

2017/09/19 07:35

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

2017/09/19 07:55

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

2017/09/19 07:56

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

回答2

0

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

php

1<?php 2//slickhtumbの基本情報入力 3 4//urlの取得 5function my_url(){ 6 $str = str_replace("/wp/", "/", $_SERVER["REQUEST_URI"]); 7 $my_url['url'] = $str; 8 $my_url['url'] = substr_replace($my_url['url'], "", 0,1);//一文字目の/を削除 9 $my_url['path'] = explode("/", $my_url['url']); 10 $my_url['url'] = "/".$my_url['url'];//一応/をいれておく。 11 return $my_url; 12} 13 14$url = my_url(); 15$url_second = isset($url['path'][1]) ? $url['path'][1] : NULL ; 16$url_third = isset($url['path'][2]) ? $url['path'][2] : NULL ; 17 18//$slickThumb[] = array( 19//'brand_slug'=>'-2ndスラッグ名', 20//'goods_slug'=>'3rdスラッグ名', 21//'list' =>'リスト要素' 22//); 23 24//ブランド:polo 25$slickThumb = array( 26 'polo' => array ( 27 'mink' => '<li>ミンクポロ</li>', 28 'flat' => '<li>フラットポロ</li>', 29 'rabbitfur' => '<li>ラビットポロ</li>', 30 ), 31 'racoste' => array ( 32 'ballet' => '<li>バレットラコステ</li>', 33 'feather' => '<li>フェザーラコステ</li>' 34 ) 35); 36 37//現在のページの情報所得 38if (isset($slickThumb[$url_second][$url_third])) { 39 echo $slickThumb[$url_second][$url_third]; 40} else { 41 echo "Item not found"; 42}

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

投稿2017/09/19 09:46

s-washion

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

holic

2017/09/19 10:01

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

0

ベストアンサー

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

PHP

1// PHP5.4+ 2$slickThumb = [ 3 'mink' => [ 4 'brand_slug' => 'polo', 5 'list' => 'ミンクポロ' 6 ], 7 'flat' => [ 8 'brand_slug' => 'polo', 9 'list' => 'フラットポロ' 10 ], 11 'rabbitfur' => [ 12 'brand_slug' => 'polo', 13 'list' => 'ラビットポロ' 14 ], 15 'ballet' => [ 16 'brand_slug' => 'racoste', 17 'list' => 'バレットラコステ' 18 ], 19 'feather' => [ 20 'brand_slug' => 'racoste', 21 'list' => 'フェザーラコステ' 22 ] 23]; 24if ( isset( $slickThumb[ $url_third ] ) && $slickThumb[ $url_third ]['goods_slug'] === $url_second) ) { 25 // in 26} else { 27 // not in 28}

追記:

PHP

1// PHP5.4+ 2$slickThumb = [ 3 'mink-polo' => [ 4 'goods_slug' => 'mink', 5 'brand_slug' => 'polo', 6 'list' => 'ミンクポロ' 7 ], 8 'flat-polo' => [ 9 'goods_slug' => 'flat', 10 'brand_slug' => 'polo', 11 'list' => 'フラットポロ' 12 ], 13 'rabbitfur-polo' => [ 14 'goods_slug' => 'rabbitfur', 15 'brand_slug' => 'polo', 16 'list' => 'ラビットポロ' 17 ], 18 'ballet-racoste' => [ 19 'goods_slug' => 'ballet', 20 'brand_slug' => 'racoste', 21 'list' => 'バレットラコステ' 22 ], 23 'feather-racoste' => [ 24 'goods_slug' => 'feather', 25 'brand_slug' => 'racoste', 26 'list' => 'フェザーラコステ' 27 ] 28]; 29if ( isset( $slickThumb[ $url_third.'-'.$url_second ] ) ) { 30 // in 31} else { 32 // not in 33}

投稿2017/09/19 09:00

編集2017/09/19 09:33
kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

holic

2017/09/19 09:22 編集

コンパクトに纏めていただきましてありがとうございます。 一点お伝えし忘れていたことがあります。五商品のgoods名が現在はユニーク値になっておりますが、今後商品が増えていった際にgoods名が同じものも出てきます、ただしbrand名は絶対に異なります。 ですのでgoods名とbrand名の二つチェックで始めユニークな配列の格納されている場所がわかりると思っております。 (申し訳ありません????)
kei344

2017/09/19 09:29

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

2017/09/19 09:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問