Попытка понять рекурсию в объектах и ​​массивах в php - PullRequest
1 голос
/ 04 августа 2011

Я пытаюсь создать запрос 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;
    }

Кажется, я не могу понять, как работать с объектом / массивом, учитывая, что я не знаю, насколько глубоко он заходит,Как я знаю, как далеко я нахожусь и как я могу получить доступ к данным, содержащимся, когда я глубоко в объекте / массиве.Я заранее благодарю вас за ваше время и помощь.

Приведенный ниже код - это код, который я использовал до того, как узнал, что может быть несколько бесконечное «вложенное» содержимое.Я включил этот код, чтобы вы могли видеть, что именно я пытаюсь выполнить.

<code>try { 
            $corpPheal = new Pheal($fullUserID, $fullAPIKey, "corp");

                $corpAssetList = $corpPheal->AssetList(array('characterID'=>$fullCharID));

                echo "<pre>";
                var_dump($corpAssetList);
                echo "
";} catch (PhealException $ e) {echo 'error:'. $ E-> code. 'Meesage:'. $ e-> getMessage ();} $ numOfAssetList = count ($ corpAssetList-> assets); для ($ i = 0; $ i <= ($ numOfAssetList -1); $ i ++) {$ numOfAssetContents = count ($ corpAssetList-> assets [$ i] -> contents); echo $ numOfAssetContents. "
\ n"; if ($ numOfAssetContents> 0) {$ count = 0; для ($ j = 0; $ j <=($ numOfAssetContents - 1); $ j ++) {echo "i = $ i, j = $ j <br>\ n"; $ count ++; foreach ($ corpAssetList-> assets [$ i] -> contents [$ j]как $ key => $ value) {switch ($ key) {case "itemID": $ qry = "INSERT INTO eve_asset_list (` itemID`, `typeID`,` amount`, `flag`,` singleton`) VALUES ('$ value', '"; break; регистр" typeID ": $ qry = $ qry. $ value."', '"; break; case" количество ": $ количество = $ value; $ qry = $ qry. $value. "','"; break; case "flag": $ qry = $ qry. $ value. "','"; break; case "singleton": $ qry = $ qry. $ value. "') ONDUPLICATE KEY UPDATE количество =$ Количество ";перерыв;}} $ result = mysql_query ($ qry);include "./include/mysqlError.inc.php";}} else {foreach ($ corpAssetList-> assets [$ i] as $ key => $ value) {switch ($ key) {case "itemID": $ qry = "INSERT INTO eve_asset_list (` itemID`, `typeID`, `amount`,` flag`, `singleton`) VALUES ('$ value', '"; break; case "typeID": $ qry = $ qry. $ value. "', '"; break; case "количество": $ amount = $ value; $ qry = $ qry. $ value." ',' "; break; case" flag ": $ qry = $ qry. $ value." ',' "; break; case" singleton": $ qry = $ qry. $ value." ') ON DUPLICATE KEY UPDATE количество = $ количество ";перерыв;} } } }

1 Ответ

1 голос
/ 04 августа 2011

Теперь ваш фрагмент кода применяет функцию к каждому элементу array_walk_recursive . Это предопределенная функция в PHP.

Функция, которая применяется прямо сейчас, проверяет, равен ли текущий ключ тому, который задан в качестве параметра. Если они равны, он сохраняет значение, а в противном случае - нет.

В конце концов возвращается первое найденное значение. Это возвращаемое значение может быть самим массивом, и вы можете использовать его для доступа к внутренним данным.

На данный момент это ничего не делает с глубиной данных. Это то, что вы хотите изменить? Если да, что бы вы хотели, чтобы функция делала?

Edit:

Возможно, вам понадобится что-то вроде

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']);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...