【问题标题】:How to replace numeric keys in associative array with their corresponding values如何将关联数组中的数字键替换为其对应的值
【发布时间】:2017-09-09 08:42:30
【问题描述】:

在 json_decode(string, true) 之后,我确实有以下关联多维数组可用。

Array
(
    [statusCode] => 200
    [data] => Array
        (
            [objects] => Array
                (
                    [0] => deals
                    [1] => contacts
                    [2] => accounts
                )

            [deals] => Array
                (
                    [0] => dealName
                    [1] => ApprovedBy
                    [2] => ApprovedDate
                    [3] => CloseDate
                )

            [contacts] => Array
                (
                    [0] => contectName
                    [1] => email
                    [2] => firstName
                    [3] => lastName 
                )

            [accounts] => Array
                (
                    [0] => accountName
                    [1] => creationDate
                    [2] => ApprovedDate
                    [3] => accountNumber
                )
        )

)

它想用数组中的对应值替换数字键,例如:

[deals] => deals
[contacts] => contacts
[accounts] => accounts

到目前为止我尝试了什么?

$finalIOArray = array();
$integrationObjectsArray = $response['data']['objects']; 
foreach($integrationObjectsArray as $integrationObject){ 
   $finalIOArray[$integrationObject] = $integrationObject; 
}

这仅适用于主数据数组中的 objects 数组。但我想用主数据数组中所有子数组中的值替换键。

【问题讨论】:

  • 你试过什么,这不是为我的网站编写代码。
  • 我所做的是:$finalIOArray = array(); $integrationObjectsArray = $response['data']['objects']; foreach($integrationObjectsArray as $integrationObject){ $finalIOArray[$integrationObject] = $integrationObject;但是如果我遵循这种方法,我必须手动处理数据数组中的每个数组。
  • 请使用此信息编辑您的原始问题。
  • 我不明白你为什么需要objects 条目;它是同一数组中其他键已经表示的内容的重复信息。我也不明白为什么 dealscontactsaccounts 是复数词,而你只在它们的值中存储一个项目。
  • objects 作为可能的选项被填充到下拉列表中。从第一个下拉列表中选择任何对象后,第二个下拉列表将填充与该对象关联的字段。参考:stackoverflow.com/questions/46128410/…

标签: php arrays associative-array


【解决方案1】:

这是问题的递归解决方案

function updateArray(array $data)
{
    $result = array();
    foreach ($data as $key => $value) {
        if (is_integer($key) && is_string($value)) { // key is integer and value is string
            $result[$value] = $value; // update the key
        } elseif (is_array($value)) { // value is array
            $result[$key] = updateArray($value); // recurse
        } else {
            $result[$key] = $value; // leave key/value alone
        }
    }
    return $result;
}

print_r(updateArray($arr));

【讨论】:

  • 让我试试这个,看起来很优雅。
【解决方案2】:

你可以这样做

foreach($arr["data"] as $key=>&$data){
  $new = array();
  foreach($data as $key2=>$value){
    $new[$value] = $value;
  }
  $data = $new;
}
print_r($arr);

现场演示:https://eval.in/858599

【讨论】:

  • 这不是必需的输出。
  • 是的,像这样。这启发了我操作主数据数组的想法。让我试试看。
  • 没错,这就是我想要一次性处理的内容。请使用此更新更新原始答案,以便我接受。
  • 更新了我的回答。只是好奇你需要像这样更新数组,我的意思是在哪个代码中?
  • 请看stackoverflow.com/questions/46128410/… 这个问题是其中的子问题(第2点),我想要一个正确的方法和方向。如果这就是您要问的,那是我的用例。
【解决方案3】:

我修改了我的代码以满足您的需要,请尝试一下。

$data = [];
foreach($arr["data"] as $key => $example) {
    $new = [];
    foreach($example as $value) {
        $new[$value] = $value;
    }
    $data[$key] = $new;
}
$arr["data"] = $data;
print_r($arr);

【讨论】:

  • 我添加了 $key's 以保留您的原始密钥,例如对象、交易、联系人、帐户。
【解决方案4】:

与其他提供的方法相比,这是一种更清洁、更直接的方法。使用 array_combine 使用子数组中的值批量重新分配键。

在我使用 foreach 的方法中,$data 之前的 & 表示“通过引用传递”。 http://php.net/manual/en/language.references.pass.php 这有效地允许修改原始数组数据,而无需编写通向特定深层元素的键。

代码:

$arr =  Array
(
    "statusCode" => 200,
    "data" => Array
        (
            "objects" => Array
                (
                    "0" => deals,
                    "1" => contacts,
                    "2" => accounts
                ),

            "deals" => Array
                (
                    "0" => dealName,
                    "1" => ApprovedBy,
                    "2" => ApprovedDate,
                    "3" => CloseDate
                ),
            "contacts" => Array
                (
                    "0" => contectName,
                    "1" => email,
                    "2" => firstName,
                    "3" => lastName 
                ),
            "accounts" => Array
                (
                    "0" => accountName,
                    "1" => creationDate,
                    "2" => ApprovedDate,
                    "3" => accountNumber
                )
        )
);
foreach($arr["data"] as &$data){
     $data=array_combine($data,$data);
}
var_export($arr);

输出:

array (
   'statusCode' => 200,
  'data' => 
  array (
    'objects' => 
    array (
      'deals' => 'deals',
      'contacts' => 'contacts',
      'accounts' => 'accounts',
    ),
    'deals' => 
    array (
      'dealName' => 'dealName',
      'ApprovedBy' => 'ApprovedBy',
      'ApprovedDate' => 'ApprovedDate',
      'CloseDate' => 'CloseDate',
    ),
    'contacts' => 
    array (
      'contectName' => 'contectName',
      'email' => 'email',
      'firstName' => 'firstName',
      'lastName' => 'lastName',
    ),
    'accounts' => 
    array (
      'accountName' => 'accountName',
      'creationDate' => 'creationDate',
      'ApprovedDate' => 'ApprovedDate',
      'accountNumber' => 'accountNumber',
    ),
  ),
)

或者,如果您更喜欢函数式迭代,这将提供相同的输出。

$arr["data"]=array_map(function ($a){return array_combine($a,$a);},$arr["data"]);
var_export($arr);

【讨论】:

  • 简洁明了。你能解释一下枚举变量 $data 之前的 & 符号吗?谢谢
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多