操作PHP数组以匹配函数的数组要求并递归调用函数
我正在尝试从我将每个月收到的CSV文件中自动更新SugarCRM系统中的某些记录.
背景/简介 我正在使用Sugar提供的以下代码来通过REST更新/创建记录. <?php include_once('parsecsv.lib.php'); // Include the parsecsv-for-php library $csv = new parseCSV('myCSV.csv'); // Parse through the CSV and store results in $csv $url = "http://{site_url}/service/v4/rest.php"; $username = "admin"; $password = "password"; //function to make cURL request function call($method,$parameters,$url) { ob_start(); $curl_request = curl_init(); curl_setopt($curl_request,CURLOPT_URL,$url); curl_setopt($curl_request,CURLOPT_POST,1); curl_setopt($curl_request,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_0); curl_setopt($curl_request,CURLOPT_HEADER,CURLOPT_SSL_VERIFYPEER,0); curl_setopt($curl_request,CURLOPT_RETURNTRANSFER,CURLOPT_FOLLOWLOCATION,0); $jsonEncodedData = json_encode($parameters); $post = array( "method" => $method,"input_type" => "JSON","response_type" => "JSON","rest_data" => $jsonEncodedData ); curl_setopt($curl_request,CURLOPT_POSTFIELDS,$post); $result = curl_exec($curl_request); curl_close($curl_request); $result = explode("rnrn",$result,2); $response = json_decode($result[1]); ob_end_flush(); return $response; } //login ----------------------------------------------- $login_parameters = array( "user_auth"=>array( "user_name"=>$username,"password"=>md5($password),"version"=>"1" ),"application_name"=>"RestTest","name_value_list"=>array(),); $login_result = call("login",$login_parameters,$url); /* echo "<pre>"; print_r($login_result); echo "</pre>"; */ //get session id $session_id = $login_result->id; //create contacts --------------------------------------- $set_entries_parameters = array( //session id "session" => $session_id,//The name of the module from which to retrieve records. "module_name" => "Accounts",//Record attributes "name_value_list" => array( array( //to update a record,you will nee to pass in a record id as commented below array("name" => "id","value" => "222221111"),array("name" => "jan_field_1","value" => "Sample Value 1"),array("name" => "jan_field_2","value" => "Sample Value 2"),// more fields could be added here ),array( //to update a record,"value" => "222222222"),),); $set_entries_result = call("set_entries",$set_entries_parameters,$url); echo "<pre>"; print_r($set_entries_result); echo "</pre>"; ?> 如果我对$set_entries_parameters数组中的值进行硬编码,一切正常,如: //Record attributes "name_value_list" => array( array( //to update a record,you will need to pass in a record id as commented below array("name" => "id",); 下面是print_r($set_entry_parameters [‘name_value_list’])的打印输出,它最终作为$paramaters传递给函数调用($method,$url) – 一切正常,每条记录的记录都正确更新. Array ( [0] => Array ( [0] => Array ( [name] => id [value] => 222221111 ) [1] => Array ( [name] => jan_field_1 [value] => Sample Value 1 ) [2] => Array ( [name] => jan_field_2 [value] => Sample Value 2 ) ) [1] => Array ( [0] => Array ( [name] => id [value] => 222222222 ) [1] => Array ( [name] => jan_field_1 [value] => Sample Value 1 ) [2] => Array ( [name] => jan_field_2 [value] => Sample Value 2 ) ) ) 我正在使用的CSV文件采用以下格式,其中id是CRM中记录的ID,每个附加列标题都是将更新的字段以及应在其中设置的值: id,field_1,field_2,field_3,field_4,field_5,field_6 222221111,21,10,8,1,1 222222222,32,7,1 333333333,17,11,4 随着时间的推移,每个新月份都会在电子表格中添加多个新列/标题. 我目前正在使用http://code.google.com/p/parsecsv-for-php/中的parsecsv-for-php库来解析CSV文件.该库在$csv-> data’中通过$csv = new parseCSV(‘myCSV.csv’)创建以下数组;: Array ( [0] => Array ( [id] => 222221111 [field_1] => 21 [field_2] => 10 [field_3] => 8 [field_4] => 0 [field_5] => 1 [field_6] => 1 ) [1] => Array ( [id] => 222222222 [field_1] => 32 [field_2] => 8 [field_3] => 7 [field_4] => 0 [field_5] => 0 [field_6] => 1 ) ) 问题/问题 最后是我正在努力解决的问题. 我需要找到一种方法来获取从parsecsv-for-php库中创建的数组,并使$set_entry_paramaters [‘name_value_list’]最终传递到更新所有记录的函数中. 在上面的例子中,如果我需要使用记录的ID和需要更新的每个字段来更新需要更新的每个子数组,一切都可以正常工作. 但$csv->数据数组每个月都会更改,需要更新新记录以及需要更新的新字段. 我猜我需要以某种方式递归地将$csv->数据数组中的任何内容添加到$set_entry_parameters [‘name_value_list’]中,但$csv->数据的键/索引与需要的内容不匹配被发送. 正如你所希望的那样,每个要更新的帐户都是它自己的数组:要更新的记录的id是一个子数组,每个要更新的字段也是一个子数组,但我解析的CSV数组并没有接近这一点. 所以在我看来,我有两个问题需要解决: >保存已解析CSV的数组需要与函数调用($method,$url)接受的数组结构匹配为$paramaters. 我试着在PHP中尝试使用array_walk或call_user_func_array方法,但我不确定这是否正确或我将如何去做. 我仍然在学习PHP,但我认为现在这已经超出了我的理解,但希望我能学会如何做到这一点.我希望我提供了足够的信息,希望有一个善良的灵魂可以帮助我.如果有帮助,我很乐意提供任何其他信息. 非常感谢你提前! 解决方法
首先,道具给你写这样一个很好的第一个问题!
你的问题的答案是将你的$csv->数据数组转换成你想要的格式是正确的,但它不必是递归的,因为你知道它的深度和一切.您可能只想与它并排构建自己的阵列,因为基本上您需要的是转换$name => $csv->数据中的$value值对应自己的数组. 这里有一个如何做到这一点的例子,在这里请耐心等待,因为我的php语法技能尽可能生锈,所以如果需要的话,请带上一些伪代码: $params = array(); foreach ($csv->data as $i => $pairs) { $csvline = array(); foreach ($pairs as $name => $value) { $csvline[] = array('name' => $name,'value' => $value) } $params[$i] = $csvline; // in your case you may also do $params[] =... } $set_entry_parameters['name_value_list'] = $params; voilá,$params是你期望的格式:) 编辑: 对于下面的注释中的附加功能,一个简单的方法是将上面的代码放入一个接收$start参数的函数中,这样就可以限制要解析的行数以及从哪里开始.例如: function parse($start) { $params = array(); foreach ($csv->data as $i => $pairs) { if($i < $start) continue; // skip it if($i == $start+10000) break; // we reached our limit,stop here $csvline = ... ... } return $params; // has at most 10000 entries } 然后你会使用一个循环,如 for($i = 0; $i < (total_lines); $i = $i + 10000) { $set_entry_parameters['name_value_list'] = parse($i); // call update } 但是,如果它实际上是您的初始CSV文件解析内存不足,您可能会发现只需手动(或以编程方式)将数据拆分为多个文件就更简单了.或者增加允许PHP使用的内存限制! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |