[英]Trying to understand recursion in objects and arrays in php
我试图建立一个将项目添加到数据库的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上的其中一个代码片段进行了一些尝试,到目前为止该代码片段似乎已经关闭。
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;
}
}
}
}
您的代码段现在要做的是将一个函数应用于每个元素array_walk_recursive 。 这是PHP中的预定义函数。
现在应用的函数将查看当前键是否等于作为参数给出的键。 如果它们相等,则存储值,否则不存储。
最终返回第一个找到的值。 此返回值可以是数组本身,您可以使用它来访问内部数据。
目前,它对数据的深度没有任何帮助。 这是您要更改的东西吗? 如果是,您希望该功能做什么?
编辑:
您可能需要类似
function insert_all($pheal_row_set)
{
foreach($pheal_row_set as $pheal_row_set_row)
{
foreach($pheal_row_set_row as $key => $value)
{
//switch statment
}
//insert
if(!is_null($pheal_row_set_row['contents']) &&
is_array($pheal_row_set_row['contents']))
{
insert_all($pheal_row_set_row['contents']);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.