示例数据库:
level1 | level2 | level3 | datatype | maxlen | minlen
-----------------------------------------------------------
version | NULL | NULL | element | 0 | 0
version | release | NULL | string | 2 | 0
version | build | NULL | string | 5 | 0
service | NULL | NULL | element | 0 | 0
service | subservice1 | NULL | element | 0 | 0
service | subservice1 | value1 | string | 10 | 5
service | subservice1 | value2 | string | 50 | 1
此表(我在此示例中省略了一堆)表示SOAP API的默认值(字符串长度,必需/可选标志和其他内容)。 我尝试了几种方法,但没有人把我带到我想去的地方。我想我不太了解递归的概念(是一个单词?)。
我需要的是一个对象
stdClass Object (
[version] => stdClass Object (
[release] => stdClass Object (
[maxlen] => 2
[minlen] => 0
)
[build] => stdClass Object (
[maxlen] => 5
[minlen] => 0
)
)
[service] => stdClass Object (
[subservice1] => stdClass Object (
[value1] => stdClass Object (
[maxlen] => 10
[minlen] => 5
)
[value2] => stdClass Object (
[maxlen] => 50
[minlen] => 1
)
)
)
)
等等。最多有7个级别,我希望能够访问这样的默认值
$var = $object->service->subservice1->value1->maxlen
也许有人可以指出我正确的方向?谢谢!
答案 0 :(得分:0)
我根本不喜欢它,但它似乎有用......
CLASS dhl_object {
public $objTemplate;
public function __construct() {
global $conn_secuser;
if(!$result = getAllRows($conn_secuser, "reference_dhl")) {
return FALSE;
} else {
if($result->num_rows<=0) {
return FALSE;
} else {
$object = new stdClass();
while($row = $result->fetch_assoc()) {
$id = $row["id"];
$L1 = $row["L1"];
$L2 = $row["L2"];
$L3 = $row["L3"];
$L4 = $row["L4"];
$L5 = $row["L5"];
$L6 = $row["L6"];
$L7 = $row["L7"];
$dataType = $row["dataType"];
$minLength = $row["minLength"];
$maxLength = $row["maxLength"];
$required = $row["required"];
$note = $row["note"];
// possible dataTypes: Element, String, Decimal, Integer, Enumeration
if($dataType!="Element") {
if($L7) {
if(!isset($object->$L1)) $object->$L1 = new stdClass();
if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4)) $object->$L1->$L2->$L3->$L4 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4->$L5)) $object->$L1->$L2->$L3->$L4->$L5 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4->$L5->$L6)) $object->$L1->$L2->$L3->$L4->$L5->$L6 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4->$L5->$L6->$L7)) $object->$L1->$L2->$L3->$L4->$L5->$L6->$L7 = new stdClass();
$object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->minLength = $minLength;
$object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->maxLength = $maxLength;
$object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->required = $required;
$object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->note = $note;
$object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->value = "";
} else
if($L6) {
if(!isset($object->$L1)) $object->$L1 = new stdClass();
if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4)) $object->$L1->$L2->$L3->$L4 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4->$L5)) $object->$L1->$L2->$L3->$L4->$L5 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4->$L5->$L6)) $object->$L1->$L2->$L3->$L4->$L5->$L6 = new stdClass();
$object->$L1->$L2->$L3->$L4->$L5->$L6->minLength = $minLength;
$object->$L1->$L2->$L3->$L4->$L5->$L6->maxLength = $maxLength;
$object->$L1->$L2->$L3->$L4->$L5->$L6->required = $required;
$object->$L1->$L2->$L3->$L4->$L5->$L6->note = $note;
$object->$L1->$L2->$L3->$L4->$L5->$L6->value = "";
} else
if($L5) {
if(!isset($object->$L1)) $object->$L1 = new stdClass();
if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4)) $object->$L1->$L2->$L3->$L4 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4->$L5)) $object->$L1->$L2->$L3->$L4->$L5 = new stdClass();
$object->$L1->$L2->$L3->$L4->$L5->minLength = $minLength;
$object->$L1->$L2->$L3->$L4->$L5->maxLength = $maxLength;
$object->$L1->$L2->$L3->$L4->$L5->required = $required;
$object->$L1->$L2->$L3->$L4->$L5->note = $note;
$object->$L1->$L2->$L3->$L4->$L5->value = "";
} else
if($L4) {
if(!isset($object->$L1)) $object->$L1 = new stdClass();
if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
if(!isset($object->$L1->$L2->$L3->$L4)) $object->$L1->$L2->$L3->$L4 = new stdClass();
$object->$L1->$L2->$L3->$L4->minLength = $minLength;
$object->$L1->$L2->$L3->$L4->maxLength = $maxLength;
$object->$L1->$L2->$L3->$L4->required = $required;
$object->$L1->$L2->$L3->$L4->note = $note;
$object->$L1->$L2->$L3->$L4->value = "";
} else
if($L3) {
if(!isset($object->$L1)) $object->$L1 = new stdClass();
if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
$object->$L1->$L2->$L3->minLength = $minLength;
$object->$L1->$L2->$L3->maxLength = $maxLength;
$object->$L1->$L2->$L3->required = $required;
$object->$L1->$L2->$L3->note = $note;
$object->$L1->$L2->$L3->value = "";
} else
if($L2) {
if(!isset($object->$L1)) $object->$L1 = new stdClass();
if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
$object->$L1->$L2->minLength = $minLength;
$object->$L1->$L2->maxLength = $maxLength;
$object->$L1->$L2->required = $required;
$object->$L1->$L2->note = $note;
$object->$L1->$L2->value = "";
} else
if($L1) {
if(!isset($object->$L1)) $object->$L1 = new stdClass();
$object->$L1->minLength = $minLength;
$object->$L1->maxLength = $maxLength;
$object->$L1->required = $required;
$object->$L1->note = $note;
$object->$L1->value = "";
}
}
}
$this->objTemplate = $object;
}
}
}
}
我希望有人有改进的建议.. :)
答案 1 :(得分:0)
这样的东西?
$root = (object) [];
while($row = $result->fetch_assoc()) {
if ($row['datatype'] == 'Element') {
continue;
}
$tgt = &$root;
for($i = 1; $i <= 7; ++$i) {
$rowkey = 'L'.$i;
if ($row[$rowkey] === null) {
break;
}
if (!property_exists($tgt, $row[$rowkey])) {
$tgt->{$row[$rowkey]} = (object) [];
}
$tgt = &$tgt->{$row[$rowkey]};
}
$tgt = (object) [
'minLength' => $row['minLength'],
'maxLength' => $row['maxLength'],
'required' => $row['required'],
'note' => $row['note'],
'value' => ''
];
}
unset($tgt);
注意:我没有运行它,因为我没有任何测试数据。应该相当接近工作。
正如其他人已经说过的那样:花一些时间阅读有关对象等,以便了解您正在使用的内容。
非常基本的编码规则:Don't Repeat Yourself我对你输入所有这些内容感到厌倦 - &gt; $ L中途通过它;)。
另外,请注意&amp ;.使用时要小心(PHP references)
(如果代码不能与你的数据一起使用,请告诉我:))