繁体   English   中英

试图了解php中对象和数组的递归

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM