「アマゾン商品の情報」から、「当プラグイン用の詳細な商品情報」を作成する
「アマゾン商品の情報」から、「当プラグイン用の詳細な商品情報」を作成する処理について、PHPソースコードを解説しています。
「当プラグイン用の詳細な商品情報」には、以下のものがあります。
- 商品に関連付けられた投稿者。
- 商品の製造者ラベル。
- 商品の製造者。
- 商品の種別。
- 「アマゾン商品の情報」から、「当プラグイン用の詳細な商品情報」を作成する
- 「当プラグイン用の詳細な商品情報」を保持するProductionItemクラス
- 「商品の種別」を、「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に設定する
- 「商品に関連付けられた投稿者の配列」を、「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に設定する
- 「商品の製造者ラベル」と「商品の製造者」を、「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に設定する
- 「アマゾン商品の情報」に「商品情報」が存在しない場合、「詳細な商品情報」が未設定の「当プラグイン用の詳細な商品情報」を作成する
- ソースコードのインテンドがやや深くて、「正常処理の流れ」がわかりにくいです
- ProductionResponse.phpのソースコード
「アマゾン商品の情報」から、「当プラグイン用の詳細な商品情報」を作成する
public static function makeProductionItem($searchItem): ProductionItem {
$productionItem = new ProductionItem ();
if (isset ( $searchItem->ItemInfo )) {
;
} else {
return $productionItem;
}
$itemInfo = $searchItem->ItemInfo;
if (isset ( $itemInfo->Classifications ) and isset ( $itemInfo->Classifications->Binding ) and
isset ( $itemInfo->Classifications->Binding->DisplayValue )) {
$bindingValue = $itemInfo->Classifications->Binding->DisplayValue;
$productionItem->setBinding ( HTMLUtils::makePlainText ( $bindingValue ) );
}
if (isset ( $itemInfo->ByLineInfo )) {
$byLineInfo = $itemInfo->ByLineInfo;
if (isset ( $byLineInfo->Contributors )) {
$contributors = $byLineInfo->Contributors; // Contributor[]
$contributorArray = array ();
foreach ( $contributors as $contributor ) {
if (isset ( $contributor ) and isset ( $contributor->Role ) and
isset ( $contributor->Name )) {
;
} else {
continue;
}
$role = HTMLUtils::makePlainText ( $contributor->Role );
$name = HTMLUtils::makePlainText ( $contributor->Name );
$contributorValue = $name . "(" . $role . ")";
array_push ( $contributorArray, $contributorValue );
if (strcmp ( $role, "著" ) == 0 and
empty ( $productionItem->getManufacturerLabel () )) {
$productionItem->setManufacturerLabel ( "出版社" );
}
}
$productionItem->setContributorArray ( $contributorArray );
}
if (isset ( $byLineInfo->Manufacturer ) and
isset ( $byLineInfo->Manufacturer->DisplayValue )) {
$manufacturer = $byLineInfo->Manufacturer;
if (isset ( $manufacturer->Label ) and
empty ( $productionItem->getManufacturerLabel () )) {
$manufacturerLabel = HTMLUtils::makePlainText ( $manufacturer->Label );
$manufacturerLabel = str_replace (
ProductionResponse::MANUFACTURER_LABEL_SEARCH,
ProductionResponse::MANUFACTURER_LABEL_REPLACE, $manufacturerLabel );
$productionItem->setManufacturerLabel ( $manufacturerLabel );
}
$manufacturerValue = HTMLUtils::makePlainText ( $manufacturer->DisplayValue );
$productionItem->setManufacturer ( $manufacturerValue );
}
}
return $productionItem;
}
$searchItem変数は、「アマゾン商品の情報」を保持します。
その「アマゾン商品の情報」が保持する「商品情報」から、
「当プラグイン用の詳細な商品情報」を作成します。
作成された「当プラグイン用の詳細な商品情報」は、$productionItem変数が保持しています。
「当プラグイン用の詳細な商品情報」には、以下のものがあります。
- 商品に関連付けられた投稿者。
- 商品の製造者ラベル。
- 商品の製造者。
- 商品の種別。
「当プラグイン用の詳細な商品情報」を保持するProductionItemクラス
「当プラグイン用の詳細な商品情報」を保持する$productionItem変数は、ProductionItemクラスの変数です。
class ProductionItem {
/* 投稿者(「役柄」と「人物名」) */
private $contributorArray = array (); // 空のオブジェクト作成に対応するため、空の配列を設定する。
/* 製造者(製造元、メーカー) */
private $manufacturerLabel = "";
private $manufacturer = "";
/* 種別(装丁、形式) */
private $binding = "";
以下省略
ProductionItemクラスは、以下の「当プラグイン用の詳細な商品情報」を保持します。
ProductionItemクラスのメンバ変数 | ProductionItemクラスのメンバ変数の説明 |
---|---|
$contributorArray | 商品に関連付けられた投稿者(配列)。 投稿者とは 、 「役柄」と「人物名」です 。 例: 「役柄」:翻訳 「人物名」:高木 XXXX |
$manufacturerLabel | 商品の製造者ラベル(文字列)。 例: 製造元 出版社 |
$manufacturer | 商品の製造者(文字列)。 例: XXXXジャパン株式会社 |
$binding | 商品の種別(バインディング)(文字列)。 バインディングとは、製品カテゴリーに似ている種別のようなものです 。 例: 大型本 ヘルスケア&ケア用品 |
「商品の種別」を、「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に設定する
$itemInfo = $searchItem->ItemInfo;
if (isset ( $itemInfo->Classifications ) and isset ( $itemInfo->Classifications->Binding ) and
isset ( $itemInfo->Classifications->Binding->DisplayValue )) {
$bindingValue = $itemInfo->Classifications->Binding->DisplayValue;
$productionItem->setBinding ( HTMLUtils::makePlainText ( $bindingValue ) );
}
$searchItem->ItemInfo->Classifications->Bindingメンバー変数の例。
stdClass Object
(
[ASIN] => XXXX000001
中略
[ItemInfo] => stdClass Object
(
[Classifications] => stdClass Object
(
[Binding] => stdClass Object
(
[DisplayValue] => 大型本
[Label] => Binding
[Locale] => ja_JP
)
中略
)
)
)
「アマゾン商品の情報」を保持する$searchItem変数に、
「商品の種別」の文字列を保持するDisplayValueメンバ変数が存在する場合、
「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に、「商品の種別」の文字列を設定します。
$bindingValue = $itemInfo->Classifications->Binding->DisplayValue;
$productionItem->setBinding ( HTMLUtils::makePlainText ( $bindingValue ) );
上記ソースコードでは、$bindingValue変数に「商品の種別」の文字列を代入します。
HTMLUtils::makePlainText()関数に$bindingValue変数を渡して、「商品の種別」の文字列をプレーンテキストに作り直します。
$productionItem->setBinding()関数を用いて、
プレーンテキストに作り直した「商品の種別」の文字列を、
「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に、設定します。
$productionItem->bindingメンバー変数の例。
goodsmemo\item\ProductionItem Object
(
中略
[binding:goodsmemo\item\ProductionItem:private] => 大型本
)
「商品に関連付けられた投稿者の配列」を、「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に設定する
$itemInfo = $searchItem->ItemInfo;
中略
if (isset ( $itemInfo->ByLineInfo )) {
$byLineInfo = $itemInfo->ByLineInfo;
if (isset ( $byLineInfo->Contributors )) {
$contributors = $byLineInfo->Contributors; // Contributor[]
$contributorArray = array ();
foreach ( $contributors as $contributor ) {
if (isset ( $contributor ) and isset ( $contributor->Role ) and
isset ( $contributor->Name )) {
;
} else {
continue;
}
$role = HTMLUtils::makePlainText ( $contributor->Role );
$name = HTMLUtils::makePlainText ( $contributor->Name );
$contributorValue = $name . "(" . $role . ")";
array_push ( $contributorArray, $contributorValue );
if (strcmp ( $role, "著" ) == 0 and
empty ( $productionItem->getManufacturerLabel () )) {
$productionItem->setManufacturerLabel ( "出版社" );
}
}
$productionItem->setContributorArray ( $contributorArray );
}
中略
}
$searchItem->ItemInfo->ByLineInfo->Contributorsメンバ変数の例。
stdClass Object
(
[ASIN] => XXXX000001
中略
[ItemInfo] => stdClass Object
(
[ByLineInfo] => stdClass Object
(
[Contributors] => Array
(
[0] => stdClass Object
(
[Locale] => ja_JP
[Name] => Kevin XXXX
[Role] => 著
[RoleType] => author
)
[1] => stdClass Object
(
[Locale] => ja_JP
[Name] => Peter XXXX
[Role] => 著
[RoleType] => author
)
[2] => stdClass Object
(
[Locale] => ja_JP
[Name] => Rasmus XXXX
[Role] => 著
[RoleType] => author
)
[3] => stdClass Object
(
[Locale] => ja_JP
[Name] => 高木 XXXX
[Role] => 翻訳
[RoleType] => translator
)
)
中略
)
)
)
「アマゾン商品の情報」を保持する$searchItem変数に、
「商品に関連付けられた投稿者の配列」を保持するContributorsメンバ変数が存在する場合、
「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に、「商品に関連付けられた投稿者の配列」を設定します。
「アマゾン商品の情報」から、「商品に関連付けられた投稿者の配列」を作成する
$contributors = $byLineInfo->Contributors; // Contributor[]
$contributorArray = array ();
foreach ( $contributors as $contributor ) {
if (isset ( $contributor ) and isset ( $contributor->Role ) and
isset ( $contributor->Name )) {
;
} else {
continue;
}
$role = HTMLUtils::makePlainText ( $contributor->Role );
$name = HTMLUtils::makePlainText ( $contributor->Name );
$contributorValue = $name . "(" . $role . ")";
array_push ( $contributorArray, $contributorValue );
if (strcmp ( $role, "著" ) == 0 and
empty ( $productionItem->getManufacturerLabel () )) {
$productionItem->setManufacturerLabel ( "出版社" );
}
}
$productionItem->setContributorArray ( $contributorArray );
$contributors変数の例。
[Contributors] => Array
(
[0] => stdClass Object
(
[Locale] => ja_JP
[Name] => Kevin XXXX
[Role] => 著
[RoleType] => author
)
[1] => stdClass Object
(
[Locale] => ja_JP
[Name] => Peter XXXX
[Role] => 著
[RoleType] => author
)
[2] => stdClass Object
(
[Locale] => ja_JP
[Name] => Rasmus XXXX
[Role] => 著
[RoleType] => author
)
[3] => stdClass Object
(
[Locale] => ja_JP
[Name] => 高木 XXXX
[Role] => 翻訳
[RoleType] => translator
)
)
「アマゾン商品の情報」の「投稿者」を保持する$contributors変数に、
「投稿者」のRoleメンバ変数と、「投稿者」のNameメンバ変数が存在する場合、
「商品に関連付けられた投稿者」の文字列を作成します。
「商品に関連付けられた投稿者」の文字列を、「商品に関連付けられた投稿者の配列」に追加します。
以上の処理を、「アマゾン商品の情報」の「投稿者」の個数だけ、ループ処理にて行います。
そのループ処理にて、「商品に関連付けられた投稿者の配列」を作成します。
$role = HTMLUtils::makePlainText ( $contributor->Role );
$name = HTMLUtils::makePlainText ( $contributor->Name );
$contributorValue = $name . "(" . $role . ")";
array_push ( $contributorArray, $contributorValue );
「商品に関連付けられた投稿者」は、以下を保持します。
- 「役柄」
- 「人物名」
$role変数に、「商品に関連付けられた投稿者」の「役柄」を代入します。
$role変数の例。
著
$name変数に、「商品に関連付けられた投稿者」の「人物名」を代入します。
$name変数の例。
Kevin XXXX
なお、$role変数、$name変数、そのどちらも、HTMLUtils::makePlainText()関数によってプレーンテキストに作り直した文字列が、代入されます。
$contributorValue変数に、「役柄」と「人物名」を合わせた文字列を代入します。
$contributorValue変数の例。
Kevin XXXX(著)
$contributorValue変数は、当プラグイン用の「商品に関連付けられた投稿者」を保持します。
$contributorValue変数の例では、商品は書籍です。
本の「著者」は、「Kevin XXXX」であることを示しています。
array_push ( $contributorArray, $contributorValue );
「$contributorArray配列の変数」は、当プラグイン用の「商品に関連付けられた投稿者の配列」です。
その「$contributorArray配列の変数」に、
$contributorValue変数が保持する「商品に関連付けられた投稿者」を、追加します。
「商品に関連付けられた投稿者」の「役柄」が書籍の著者の場合、「商品の製造者ラベル」を「出版社」と設定する
if (strcmp ( $role, "著" ) == 0 and
empty ( $productionItem->getManufacturerLabel () )) {
$productionItem->setManufacturerLabel ( "出版社" );
}
「アマゾン商品の情報」が書籍を示す場合、「商品の製造者ラベル」を「出版社」にします。
- $role変数が保持する、「商品に関連付けられた投稿者」の「役柄」が「著」である。
- 「当プラグイン用の詳細な商品情報」を保持する$productionItem変数において、
「商品の製造者ラベル」が未設定である(空文字である)。
以上の二つが成り立つ場合、$productionItem変数に対して、
「商品の製造者ラベル」を「出版社」と設定します。
二つの文字列を比較するのに、strcmp()関数を使っています
上記のソースコードでは、文字列の比較でstrcmp()関数を使っています。
strcmp()関数は、二つの文字列を辞書順に比較して、
同じなら0、違うなら0以外の値を返します。
なお、strcmp()関数で文字列を比較する場合、エンコーディングに注意する必要があります。
比較する文字列が、どちらもUTF-8でエンコーディングされていることなどに、注意する必要があります。
もしも、異なるエンコーディングの文字列を比較したい場合は、mb_strcmp()関数を使うと良いです。
mb_strcmp()関数の使い方は、以下の通りです。
mb_strcmp(比較する文字列1, 比較する文字列2, エンコーディング)
商品が書籍の場合、「商品の製造者ラベル」は「出版社」の方が良いと判断しました
当プラグインを開発していた当時(たぶん2018年当時)、アマゾン商品が書籍の場合、
「商品の製造者ラベル」が「Manufacturer」(製造元)になっていました。
※2023年3月時点でも、そうなっていました。
商品が書籍の場合、「商品の製造者ラベル」は「出版社」の方が良い、と判断しました。
なので当プラグインのプログラムにて、
「商品の製造者ラベル」を「出版社」と設定しています。
作成された「商品に関連付けられた投稿者の配列」を、「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に設定する
foreach ( $contributors as $contributor ) {
中略
}
$productionItem->setContributorArray ( $contributorArray );
「アマゾン商品の情報」の「投稿者」の個数だけ、ループ処理を行なった後、
「商品に関連付けられた投稿者の配列」である「$contributorArray配列の変数」が、作成されています。
作成された「$contributorArray配列の変数」の例。
("Kevin XXXX(著)", "Peter XXXX(著)", "Rasmus XXXX(著)","高木 XXXX(翻訳)")
「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に、
「商品に関連付けられた投稿者の配列」である「$contributorArray配列の変数」を、設定します。
$productionItem->contributorArrayメンバ変数の例。
goodsmemo\item\ProductionItem Object
(
[contributorArray:goodsmemo\item\ProductionItem:private] => Array
(
[0] => Kevin XXXX(著)
[1] => Peter XXXX(著)
[2] => Rasmus XXXX(著)
[3] => 高木 XXXX(翻訳)
)
以下省略
)
「商品の製造者ラベル」と「商品の製造者」を、「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に設定する
// str_replace()用 検索文字列と置換文字列
const MANUFACTURER_LABEL_SEARCH = array ("Manufacturer"
);
const MANUFACTURER_LABEL_REPLACE = array ("製造元"
);
中略
$itemInfo = $searchItem->ItemInfo;
中略
if (isset ( $itemInfo->ByLineInfo )) {
$byLineInfo = $itemInfo->ByLineInfo;
中略
if (isset ( $byLineInfo->Manufacturer ) and
isset ( $byLineInfo->Manufacturer->DisplayValue )) {
$manufacturer = $byLineInfo->Manufacturer;
if (isset ( $manufacturer->Label ) and
empty ( $productionItem->getManufacturerLabel () )) {
$manufacturerLabel = HTMLUtils::makePlainText ( $manufacturer->Label );
$manufacturerLabel = str_replace (
ProductionResponse::MANUFACTURER_LABEL_SEARCH,
ProductionResponse::MANUFACTURER_LABEL_REPLACE, $manufacturerLabel );
$productionItem->setManufacturerLabel ( $manufacturerLabel );
}
$manufacturerValue = HTMLUtils::makePlainText ( $manufacturer->DisplayValue );
$productionItem->setManufacturer ( $manufacturerValue );
}
}
$searchItem->ItemInfo->ByLineInfo->Manufacturerメンバ変数の例。
stdClass Object
(
[ASIN] => XXXX000001
中略
[ItemInfo] => stdClass Object
(
[ByLineInfo] => stdClass Object
(
[Manufacturer] => stdClass Object
(
[DisplayValue] => XXXXジャパン
[Label] => Manufacturer
[Locale] => ja_JP
)
)
中略
)
)
「アマゾン商品の情報」を保持する$searchItem変数に、
「商品の製造者ラベル」を保持するLabelメンバ変数が存在する場合、
「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に、「商品の製造者ラベル」を設定します。
同様に、「アマゾン商品の情報」を保持する$searchItem変数に、
「商品の製造者」を保持するDisplayValueメンバ変数が存在する場合、
「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に、「商品の製造者」を設定します。
「商品の製造者ラベル」を、$productionItem変数に設定する
// str_replace()用 検索文字列と置換文字列
const MANUFACTURER_LABEL_SEARCH = array ("Manufacturer"
);
const MANUFACTURER_LABEL_REPLACE = array ("製造元"
);
中略
$manufacturer = $byLineInfo->Manufacturer;
if (isset ( $manufacturer->Label ) and
empty ( $productionItem->getManufacturerLabel () )) {
$manufacturerLabel = HTMLUtils::makePlainText ( $manufacturer->Label );
$manufacturerLabel = str_replace (
ProductionResponse::MANUFACTURER_LABEL_SEARCH,
ProductionResponse::MANUFACTURER_LABEL_REPLACE, $manufacturerLabel );
$productionItem->setManufacturerLabel ( $manufacturerLabel );
}
$searchItem->ItemInfo->ByLineInfo->Manufacturerメンバー変数の例。
[Manufacturer] => stdClass Object
(
[DisplayValue] => XXXXジャパン
[Label] => Manufacturer
[Locale] => ja_JP
)
- $manufacturer変数に、「商品の製造者ラベル」を保持するLabelメンバ変数が存在する。
- 「当プラグイン用の詳細な商品情報」を保持する$productionItem変数において、
「商品の製造者ラベル」が未設定である(空文字である)。
以上の二つが成り立つ場合、
$productionItem変数に「商品の製造者ラベル」を設定します。
$productionItem変数の「商品の製造者ラベル」においては、すでに「商品の製造者ラベル」が設定済みの場合があります。
当記事の「見出し」
「商品に関連付けられた投稿者」の「役柄」が書籍の著者の場合、「商品の製造者ラベル」を「出版社」と設定する
を、参照してください。
// str_replace()用 検索文字列と置換文字列
const MANUFACTURER_LABEL_SEARCH = array ("Manufacturer"
);
const MANUFACTURER_LABEL_REPLACE = array ("製造元"
);
中略
$manufacturerLabel = HTMLUtils::makePlainText ( $manufacturer->Label );
$manufacturerLabel = str_replace (
ProductionResponse::MANUFACTURER_LABEL_SEARCH,
ProductionResponse::MANUFACTURER_LABEL_REPLACE, $manufacturerLabel );
$productionItem->setManufacturerLabel ( $manufacturerLabel );
$manufacturerLabel変数に、「商品の製造者ラベル」の文字列を代入します。
$manufacturerLabel変数の例。
Manufacturer
$manufacturerLabel変数の文字列に対して、str_replace()関数を用いて、文字列の置換を試みます。
例えば、「Manufacturer」を「製造元」に置き換えます。
文字列が置換された$manufacturerLabel変数の例。
製造元
「商品の製造者ラベル」において、
英単語の「Manufacturer」よりも、日本語の「製造元」の方がわかりやすい、と判断しました。
よって、文字列を上記のように置換しました。
その後、「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に、
文字列が置換された「商品の製造者ラベル」を、設定します。
$productionItem->manufacturerLabelメンバ変数の例。
goodsmemo\item\ProductionItem Object
(
中略
[manufacturerLabel:goodsmemo\item\ProductionItem:private] => 製造元
中略
)
「商品の製造者ラベル」の文字列を置換するstr_replace()関数について
// str_replace()用 検索文字列と置換文字列
const MANUFACTURER_LABEL_SEARCH = array ("Manufacturer"
);
const MANUFACTURER_LABEL_REPLACE = array ("製造元"
);
中略
$manufacturerLabel = str_replace (
ProductionResponse::MANUFACTURER_LABEL_SEARCH,
ProductionResponse::MANUFACTURER_LABEL_REPLACE, $manufacturerLabel );
str_replace()関数の引数の説明は、以下の通りです。
- ProductionResponse::MANUFACTURER_LABEL_SEARCHは、置き換える対象となる文字列の配列です。
- ProductionResponse::MANUFACTURER_LABEL_REPLACEは、置き換える文字列の配列です。
- $manufacturerLabel変換は、検索と置き換えを行う文字列です。
str_replace()関数の戻り値は、文字列を置換した結果の文字列です。
なお、str_replace()関数については、以下の関連記事でも考察しています。
※関連記事:「表示するHTML」を作成する、検索・置換対象の文字列を配列で指定するstr_replace()関数
「商品の製造者」を、$productionItem変数に設定する
$manufacturerValue = HTMLUtils::makePlainText ( $manufacturer->DisplayValue );
$productionItem->setManufacturer ( $manufacturerValue );
$searchItem->ItemInfo->ByLineInfo->Manufacturerメンバー変数の例。
[Manufacturer] => stdClass Object
(
[DisplayValue] => XXXXジャパン
[Label] => Manufacturer
[Locale] => ja_JP
)
$manufacturerValue変数に、「商品の製造者」の文字列を代入します。
HTMLUtils::makePlainText()関数に$manufacturer->DisplayValueメンバ変数を渡して、「商品の製造者」の文字列をプレーンテキストに作り直します。
プレーンテキストに作り直した「商品の製造者」の文字列を、$manufacturerValue変数に代入します。
$manufacturerValue変数が保持する「商品の製造者」の文字列を、
「当プラグイン用の詳細な商品情報」を保持する$productionItem変数に、設定します。
$productionItem->manufacturerメンバ変数の例。
goodsmemo\item\ProductionItem Object
(
中略
[manufacturer:goodsmemo\item\ProductionItem:private] => XXXXジャパン
中略
)
「アマゾン商品の情報」に「商品情報」が存在しない場合、「詳細な商品情報」が未設定の「当プラグイン用の詳細な商品情報」を作成する
public static function makeProductionItem($searchItem): ProductionItem {
$productionItem = new ProductionItem ();
if (isset ( $searchItem->ItemInfo )) {
;
} else {
//「アマゾン商品の情報」に「商品情報」が存在しない場合
return $productionItem;
}
//「商品の種別」が存在する場合、「当プラグイン用の詳細な商品情報」に「商品の種別」を設定する。
//「商品に関連付けられた投稿者」が存在する場合、「当プラグイン用の詳細な商品情報」に「商品に関連付けられた投稿者」を設定する。
//「商品の製造者ラベル」が存在する場合、「当プラグイン用の詳細な商品情報」に「商品の製造者ラベル」を設定する。
//「商品の製造者」が存在する場合、「当プラグイン用の詳細な商品情報」に「商品の製造者」を設定する。
//「詳細な商品情報」が未設定の「当プラグイン用の詳細な商品情報」
//または
//「詳細な商品情報」が設定済みの「当プラグイン用の詳細な商品情報」
//を、return文で返す。
return $productionItem;
}
$searchItem変数の例。
stdClass Object
(
[ASIN] => XXXX000001
中略
[ItemInfo] => stdClass Object
(
中略
)
)
「アマゾン商品の情報」に「商品情報」が存在しない場合、
「詳細な商品情報」が未設定の「当プラグイン用の詳細な商品情報」を、作成します。
「詳細な商品情報」が未設定の「当プラグイン用の詳細な商品情報」とは、
「商品の種別」などの「詳細な商品情報」を設定していない$productionItem変数のことです。
if (isset ( $searchItem->ItemInfo )) {
;
} else {
//「アマゾン商品の情報」に「商品情報」が存在しない場合
return $productionItem;
}
「アマゾン商品の情報」に「商品情報」が存在しない場合、
「詳細な商品情報」が未設定の$productionItem変数を、return文で返します。
上記ソースコードのisset()関数において、
$searchItem->ItemInfoメンバ変数が設定されている。
以上の条件が成り立つなら、ここでは何もせず、次の処理に進みます。
以上の条件が成り立たない場合は、
「アマゾン商品の情報」を保持する$searchItem変数に、「商品情報」が存在しない場合です。
この場合は、「詳細な商品情報」が未設定の$productionItem変数を、return文で返します。
//「詳細な商品情報」が未設定の「当プラグイン用の詳細な商品情報」
//または
//「詳細な商品情報」が設定済みの「当プラグイン用の詳細な商品情報」
//を、return文で返す。
return $productionItem;
}
同様に、
- 「商品の種別が存在しない」
- そして「商品に関連付けられた投稿者が存在しない」
- そして「商品の製造者ラベルが存在しない」
- そして「商品の製造者が存在しない」
上記の四つの条件が成り立つ場合、
「アマゾン商品の情報」を保持する$searchItem変数に、「商品情報」が存在しない場合です。
この場合も、「詳細な商品情報」が未設定の$productionItem変数を、return文で返します。
ソースコードのインテンドがやや深くて、「正常処理の流れ」がわかりにくいです
public static function makeProductionItem($searchItem): ProductionItem {
中略
if (isset ( $itemInfo->ByLineInfo )) {
$byLineInfo = $itemInfo->ByLineInfo;
if (isset ( $byLineInfo->Contributors )) {
$contributors = $byLineInfo->Contributors; // Contributor[]
$contributorArray = array ();
foreach ( $contributors as $contributor ) {
if (isset ( $contributor ) and isset ( $contributor->Role ) and
isset ( $contributor->Name )) {
;
} else {
continue;
}
$role = HTMLUtils::makePlainText ( $contributor->Role );
$name = HTMLUtils::makePlainText ( $contributor->Name );
$contributorValue = $name . "(" . $role . ")";
array_push ( $contributorArray, $contributorValue );
if (strcmp ( $role, "著" ) == 0 and
empty ( $productionItem->getManufacturerLabel () )) {
$productionItem->setManufacturerLabel ( "出版社" );
}
}
$productionItem->setContributorArray ( $contributorArray );
}
以下省略
}
上記のソースコードにおいて、インテンドがやや深いです。
例えば、foreach文の中にあるif文は、インテンドが深くなっています。
そのため、「正常処理の流れ」がわかりにくくなっています。
ソースコードのインテンドを浅くするために、
foreach文のループ処理を、別の関数にまとめた方が良かったかもしれません。
※関連記事:垂直な一本の線、Javaプログラムの正常処理の流れ
プログラムの構造をわかりやすくする、ソースコードのインテンド
ソースコードのインテンドとは、コードの行頭に挿入した空白やタブのことです。
インテンドは、コードのブロックや階層を視覚的に表現する役割を果たします。
そんなインテンドは、プログラムの構造や可読性を向上させるために用いられます。
インテンドの方法は、言語や環境によって異なります。
一般的には、同じレベルのコードには同じ幅のインテンドを適用します。
ネストされたコードにはインテンドを増やす、という原則があります。
ソースコードの複雑さを示す、深すぎるインテンド
インテンドの深さは、一般的に4段階以下にすることが推奨されています。
ソースコードのインテンドが深い状態は、ソースコードの構造や意味を表すために、行頭に空白やタブを入れることが多い、という状態です。
深すぎるインテンドは、逆にソースコードの「複雑さ」や「冗長さ」を示す可能性があります。
インテンドは、ソースコードの意味や動作に直接影響するものではありません。
しかし、インテンドの統一性や規約の遵守は、ソースコードの品質やメンテナンス性に大きく関わります。
インテンドが深いソースコードを改善する方法としては、以下のものがあります。
- 関数やクラスに分割する。
- 条件分岐やループを簡略化する。
ProductionResponse.phpのソースコード
<?php
namespace goodsmemo\amazon\withoutsdk;
use goodsmemo\item\ProductionItem;
use goodsmemo\item\html\HTMLUtils;
require_once GOODS_MEMO_DIR . "item/ProductionItem.php";
require_once GOODS_MEMO_DIR . "item/html/HTMLUtils.php";
class ProductionResponse {
// str_replace()用 検索文字列と置換文字列
const MANUFACTURER_LABEL_SEARCH = array ("Manufacturer"
);
const MANUFACTURER_LABEL_REPLACE = array ("製造元"
);
public static function makeProductionItem($searchItem): ProductionItem {
$productionItem = new ProductionItem ();
if (isset ( $searchItem->ItemInfo )) {
;
} else {
return $productionItem;
}
$itemInfo = $searchItem->ItemInfo;
if (isset ( $itemInfo->Classifications ) and isset ( $itemInfo->Classifications->Binding ) and
isset ( $itemInfo->Classifications->Binding->DisplayValue )) {
$bindingValue = $itemInfo->Classifications->Binding->DisplayValue;
$productionItem->setBinding ( HTMLUtils::makePlainText ( $bindingValue ) );
}
if (isset ( $itemInfo->ByLineInfo )) {
$byLineInfo = $itemInfo->ByLineInfo;
if (isset ( $byLineInfo->Contributors )) {
$contributors = $byLineInfo->Contributors; // Contributor[]
$contributorArray = array ();
foreach ( $contributors as $contributor ) {
if (isset ( $contributor ) and isset ( $contributor->Role ) and
isset ( $contributor->Name )) {
;
} else {
continue;
}
$role = HTMLUtils::makePlainText ( $contributor->Role );
$name = HTMLUtils::makePlainText ( $contributor->Name );
$contributorValue = $name . "(" . $role . ")";
array_push ( $contributorArray, $contributorValue );
if (strcmp ( $role, "著" ) == 0 and
empty ( $productionItem->getManufacturerLabel () )) {
$productionItem->setManufacturerLabel ( "出版社" );
}
}
$productionItem->setContributorArray ( $contributorArray );
}
if (isset ( $byLineInfo->Manufacturer ) and
isset ( $byLineInfo->Manufacturer->DisplayValue )) {
$manufacturer = $byLineInfo->Manufacturer;
if (isset ( $manufacturer->Label ) and
empty ( $productionItem->getManufacturerLabel () )) {
$manufacturerLabel = HTMLUtils::makePlainText ( $manufacturer->Label );
$manufacturerLabel = str_replace (
ProductionResponse::MANUFACTURER_LABEL_SEARCH,
ProductionResponse::MANUFACTURER_LABEL_REPLACE, $manufacturerLabel );
$productionItem->setManufacturerLabel ( $manufacturerLabel );
}
$manufacturerValue = HTMLUtils::makePlainText ( $manufacturer->DisplayValue );
$productionItem->setManufacturer ( $manufacturerValue );
}
}
return $productionItem;
}
}