【发布时间】:2011-10-20 02:48:15
【问题描述】:
我正在尝试构建一个将项目添加到数据库的 mysql 查询。这些项目保存在一个对象中,其格式如下:
object(PhealResult)#7 (5) {
["request_time"]=>
string(19) "2011-08-04 14:14:37"
["request_time_unixtime"]=>
int(1312467277)
["cached_until"]=>
string(19) "2011-08-04 20:14:37"
["cached_until_unixtime"]=>
int(1312488877)
["_element:private"]=>
object(PhealElement)#12 (3) {
["_name"]=>
string(6) "result"
["_value"]=>
object(PhealContainer)#11 (1) {
["_container:private"]=>
array(1) {
["assets"]=>
object(PhealRowSet)#14 (3) {
[0]=>
object(PhealRowSetRow)#19 (6) {
["itemID"]=>
string(13) "1003152969505"
["locationID"]=>
string(8) "30000157"
["typeID"]=>
string(5) "11489"
["quantity"]=>
string(1) "1"
["flag"]=>
string(1) "0"
["singleton"]=>
string(1) "1"
}
[1]=>
object(PhealRowSetRow)#18 (7) {
["itemID"]=>
string(9) "290900396"
["locationID"]=>
string(8) "66002198"
["typeID"]=>
string(2) "27"
["quantity"]=>
string(1) "1"
["flag"]=>
string(2) "71"
["singleton"]=>
string(1) "1"
["contents"]=>
object(PhealRowSet)#24 (15) {
[0]=>
object(PhealRowSetRow)#29 (5) {
["itemID"]=>
string(13) "1003305129036"
["typeID"]=>
string(4) "2183"
["quantity"]=>
string(1) "4"
["flag"]=>
string(3) "117"
["singleton"]=>
string(1) "0"
}
**cropped**
}
}
**cropped**
}
}
}
}
特别注意嵌套的工作方式。顶级行集被命名为“资产”,但其中的每个项目都可以有“内容”。其中的每个项目也可以有一个“内容”列表。就 EVE 而言,它可以走多远是有限制的,但这个限制是未知的,代码应该假设没有真正的限制。
我对位于http://php.net/manual/en/language.types.array.php 上的代码 sn-ps 进行了一些尝试,目前该代码似乎已关闭。
function array_value_recursive($key, array $arr){
$val = null;
array_walk_recursive($arr, function($v, $k) use($key, &$val){
$val = $k == $key ? $v : (!is_null($val) ? $val : false);
});
return $val;
}
鉴于我不知道它有多深,我似乎无法理解如何使用对象/数组。我如何知道我在对象/数组中的深度以及如何访问包含的数据。预先感谢您的时间和帮助。
下面的代码是我在知道可能存在无穷无尽的嵌套“内容”之前使用的代码。我已包含此代码,因此您可以看到我要完成的工作。
try {
$corpPheal = new Pheal($fullUserID, $fullAPIKey, "corp");
$corpAssetList = $corpPheal->AssetList(array('characterID'=>$fullCharID));
echo "<pre>";
var_dump($corpAssetList);
echo "</pre>";
}
catch (PhealException $e) {
echo 'error: ' . $e->code . ' meesage: ' . $e->getMessage();
}
$numOfAssetList = count($corpAssetList->assets);
for ($i =0; $i <= ($numOfAssetList -1); $i++){
$numOfAssetContents = count($corpAssetList->assets[$i]->contents);
echo $numOfAssetContents . "<br>\n";
if ($numOfAssetContents > 0){
$count = 0;
for ($j=0; $j <= ($numOfAssetContents - 1); $j++){
echo "i = $i, j = $j <br>\n";
$count++;
foreach ($corpAssetList->assets[$i]->contents[$j] as $key => $value){
switch ($key) {
case "itemID":
$qry = "INSERT INTO eve_asset_list(`itemID`, `typeID`, `quantity`, `flag`, `singleton`) VALUES('$value','";
break;
case "typeID":
$qry = $qry . $value . "','";
break;
case "quantity":
$quantity = $value;
$qry = $qry . $value . "','";
break;
case "flag":
$qry = $qry . $value . "','";
break;
case "singleton":
$qry = $qry . $value . "') ON DUPLICATE KEY UPDATE quantity = $quantity";
break;
}
}
$result = mysql_query($qry);
include "./includes/mysqlError.inc.php";
}
}else {
foreach ($corpAssetList->assets[$i] as $key => $value){
switch ($key) {
case "itemID":
$qry = "INSERT INTO eve_asset_list(`itemID`, `typeID`, `quantity`, `flag`, `singleton`) VALUES('$value','";
break;
case "typeID":
$qry = $qry . $value . "','";
break;
case "quantity":
$quantity = $value;
$qry = $qry . $value . "','";
break;
case "flag":
$qry = $qry . $value . "','";
break;
case "singleton":
$qry = $qry . $value . "') ON DUPLICATE KEY UPDATE quantity = $quantity";
break;
}
}
}
}
【问题讨论】:
-
是递归的概念困扰着你还是如何用 php 做到这一点?
-
我不明白如何使递归发生,因此当我编写 mysql 语句时,我将使用数组/对象中 x 位置的数据。最初我不知道对象/数组可以继续深入增长并使用多个嵌套的 for 语句,但这种方法会非常臃肿。我知道答案是使用递归来获得我正在寻找的结果,但我不太明白我如何知道我在哪里以及如何获取我所在位置的数据。我确实将递归的概念理解为调用自身的函数。
标签: php arrays object recursion nested