我目前有兩個類。Php:把它變成一個遞歸函數
的ArrayCompare
類:
<?php
namespace App\Tools\RegexExtract;
class ArrayCompare
{
public function compare(Array $arrayToCompare)
{
$elementData = new ElementMetaData();
$metaData = $elementData->extract($arrayToCompare[0], [], $initial=true);
foreach ($arrayToCompare as $currentElement) {
$metaData = $elementData->extract($currentElement, $metaData);
}
return $metaData;
}
}
它使用ElementMetaData
類
<?php
/**
* A class for extracting meta data from an element.
*/
namespace App\Tools\RegexExtract;
class ElementMetaData
{
public function extract($element, $metaDataToCompare = [], $initial = false)
{
if ($initial == true) {
$this->isInteger($element) ? $returnMetaData['isInteger'] = $this->isInteger($element) : null;
$returnMetaData['length'] = $this->length($element);
}
else {
$returnMetaData=$metaDataToCompare;
if ($returnMetaData != []) {
if (isset ($returnMetaData['isInteger']) && !$this->isInteger($element)) {
unset($returnMetaData['isInteger']);
}
if (isset ($returnMetaData['length']) && $this->length($element) != $returnMetaData['length']) {
unset($returnMetaData['length']);
}
}
}
return $returnMetaData;
}
private function isInteger($element)
{
return is_int($element);
}
private function length($element)
{
return strlen($element);
}
}
的基本功能是:
給出我有一個數組
$arr=[1,2,3];
我想獲得之間的「相似性」全部元素。根據數組我預定義......所以這將帶來這樣的結果:
$metaArray=['isInteger'=>true,'length'=>1];
,這將帶來剛剛長度相似:
$arr=[1,2,'D'];
$metaArray=['length'=>1];
雖然這陣將提供一個空的結果[]
$arr=[1,2,'3D']; // result is [] since not all integers or not all of same length.
現在我的解決方案不使用遞歸函數......但我確信它可以以某種方式使用。
此外,我想添加更多的「標準」....所以"isEmailAdress", "beginswithA"
....等......這將使我的if語句是一個恐怖......所以什麼是最好的策略/設計在這裏遵循的模式?
我看不到你的任務任何遞歸模式。儘管你可以編寫任何順序摺疊作爲遞歸。問題:你需要這裏嗎? – dmitry
很高興聽到這一點。我認爲有改進/表演的餘地。由於這些數組可能會很長......但如果有更好的方式進行可讀性設計模式路徑上的代碼管理,很高興聽到它。 – Confidence
我沒有看到單獨的'ElementMetaData'類的任何需要,因爲它根本沒有狀態,只是以靜態方式調用'extract'。它不應該是一個類,整個事情可能只是在一個函數中實現,使用'if..elseif'或'case'來測試你的標準。特別是如果表現是一個問題。 – dmitry