如何用相应的值替换关联数组中的数字键

How to replace numeric keys in associative array with their corresponding values

在 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 数组。但是我想用主数据数组中所有子数组中的值替换键。

你可以这样做

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

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

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

这是问题的递归解法

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));

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

在我使用 foreach 的方法中,$data 之前的 & 表示 "passing by reference" 。 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);