So I am trying to update a user meta data array that I have previously stored with this function: function oe_charge_customer( $customer ) { // load the stripe libraries require_once(STRIPE_BASE_DIR . '/lib/Stripe.php'); // check if in test mode or not check_stripe_api(); // counter $i = $customer['i']; // get user meta, if any $payment_args = get_user_meta( $customer['user_id'], 'oe_customer_details' ); // update paid value to true $payment_args[0]['payments'][$i]['paid'] = $i; // attempt to charge the customer's card try { $charge = Stripe_Charge::create(array( 'amount' => $customer['amount'] * 100, 'currency' => 'usd', 'customer' => $customer['cust_id'] ) ); // update user profile to show paid update_user_meta( $customer['user_id'], 'oe_customer_details', $payment_args ); } catch (Exception $e) { wp_die($e); } } I am getting somewhat expected results, except it keeps throwing it in a new array every time it gets updated. Any idea why this is happening? I can't seem to wrap my head around it . I get the following after it gets updated: Array ( [0] => Array ( [0] => Array ( [0] => Array ( [0] => Array ( [0] => Array ( [customer] => Array ( [name] => [id] => cus_2Oo1hyvYyZsaj0 [user_id] => 18 ) [payments] => Array ( [0] => Array ( [amount] => 16 [date] => 1376710188 [paid] => 0 ) [1] => Array ( [amount] => 4 [date] => 1376710238 [paid] => 0 ) ) ) [payments] => Array ( [0] => Array ( [paid] => 0 ) ) ) ) [payments] => Array ( [1] => Array ( [paid] => 1 ) ) ) ) )