Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
操作PHP数组以匹配函数的数组要求,并递归调用函数_Php_Arrays_Csv_Sugarcrm - Fatal编程技术网

操作PHP数组以匹配函数的数组要求,并递归调用函数

操作PHP数组以匹配函数的数组要求,并递归调用函数,php,arrays,csv,sugarcrm,Php,Arrays,Csv,Sugarcrm,我正在努力从每月收到的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 $ur

我正在努力从每月收到的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, 1);
    curl_setopt($curl_request, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl_request, 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("\r\n\r\n", $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" => "111111111"),
            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, you will nee to pass in a record id as commented below
            array("name" => "id", "value" => "222222222"),
            array("name" => "jan_field_1", "value" => "Sample Value 1"),
            array("name" => "jan_field_2", "value" => "Sample Value 2"),
            // more fields could be added here
         ),
     ),
);

$set_entries_result = call("set_entries", $set_entries_parameters, $url);

echo "<pre>";
print_r($set_entries_result);
echo "</pre>";

?>
下面是
print\r($set\u entry\u parameters['name\u value\u list'])
的打印输出,它最终被传递到
函数调用($method,$parameters,$url)
作为
$paramaters
——一切正常,每条记录都被正确更新

Array
(
[0] => Array
    (
        [id] => 111111111
        [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
    )
)
我正在使用的CSV文件采用以下形式,其中id是CRM中记录的id,每个附加列标题是将更新的字段以及应设置的值:

$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;
随着时间的推移,每个新月份都会向电子表格中添加多个新列/标题

我目前正在使用来自的parsecsv for php库来解析CSV文件。库通过
$csv=new parseCSV('myCSV.csv')在
$csv->data'
中创建以下数组

问题/问题

最后是我正在努力解决的问题

我需要找到一种方法来获取从parsecsv for php库创建的数组,并使$set_entry_paramaters['name_value_list']最终传递到更新所有记录的函数中

在上面的示例中,如果我用记录ID和每个需要更新的字段硬编码每个需要更新的子数组,那么一切都可以正常工作

但是
$csv->data
数组每个月都会发生变化,需要更新新记录和新字段

我猜我需要以某种方式递归地将
$csv->data
数组中的任何内容添加到
$set\u entry\u parameters['name\u value\u list']
中,但是
$csv->data
的键/索引与需要发送的内容不匹配

正如您所看到的(希望如此),每个要更新的帐户都是它自己的数组:要更新的记录的id是一个子数组,每个要更新的字段也是一个子数组,但我解析的CSV数组与此不符

所以在我看来,我有两个问题需要解决:

  • 保存已解析CSV的数组需要与
    函数调用($method,$parameters,$url)
    接受为
    $paramaters
    的数组结构相匹配
  • 函数调用($method,$parameters,$url)
    需要为每个需要更新的记录调用一次
  • 我已经研究过如何在PHP中使用
    array\u walk
    call\u user\u func\u array
    方法,但我不确定这是否正确,也不确定我将如何去做

    我仍在学习PHP,但我认为这确实超出了我目前的理解,但希望我能学会如何做到这一点。我希望我已经提供了足够的信息,希望有一个善良的灵魂可以给我帮助。如果有帮助的话,我很乐意提供更多的信息


    提前非常感谢

    首先,感谢你写了这么好的第一个问题

    您的问题的答案是将
    $csv->data
    数组转换为您想要的格式,这是正确的,但它不必是递归的,因为您知道它的深度和所有内容。您可能只想与它并排构建自己的数组,因为基本上您需要将
    $name=>$value
    对从
    $csv->data
    转换为自己的数组

    下面是一个如何实现的示例,请耐心听我说,因为我的php语法技能已经非常生疏,所以如果需要,可以使用一些伪代码:

    for($i = 0; $i < (total_lines); $i = $i + 10000) {
        $set_entry_parameters['name_value_list'] = parse($i);
        // call update
    }
    
    瞧,
    $params
    是您期望的格式:)

    编辑: 对于下面注释中的附加功能,一种简单的方法是将上述代码放入接收
    $start
    参数的函数中,这样就可以限制要分析的行数以及从何处开始。例如:

    函数解析($start){
    $params=array();
    foreach($csv->data as$i=>$pairs){
    如果($i<$start)继续;//跳过它
    如果($i==$start+10000)突破;//我们达到了极限,停在这里
    $csvline=。。。
    ...
    }
    return$params;//最多有10000个条目
    }
    
    然后你会使用一个循环,比如

    for($i=0;$i<(行总数);$i=$i+10000){
    $set_entry_parameters['name_value_list']=parse($i);
    //呼叫更新
    }
    

    但是,如果您的初始CSV文件解析内存不足,您可能会发现手动(或编程)将数据拆分为多个文件更简单。或者增加允许PHP使用的内存限制

    “工作得很有魅力,”亚瑟!我一直在尝试使用一些
    foreach
    循环来构造数组,但我无法完全确定它。看到它是如何完成的确实有助于我理解进步。我想我需要提出一个新的后续问题,因为我现在遇到了CSV文件太大(~75000行)的问题,并且脚本内存不足,即使它是通过带有
    php-f
    的命令行运行的。因此,我认为我需要以某种方式编写一个函数,一次只解析一定数量的行,并调用该函数进行更新。@CastleBrav0很高兴听到它工作了!关于您的后续问题,请参见上面的编辑。您可能想搜索“php内存限制”,因为我相信您的计算机可以处理75k行,您可能只需要松开对php的限制!
    Array
    (
    [0] => Array
        (
            [id] => 111111111
            [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
        )
    )
    
    $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;
    
    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
    }