PHP递归数组从JSON到键值到值


PHP recursive array from JSON to key-value to values

如果这个问题已经被问到,我想提前道歉,我不太确定这个应该叫什么。


我将数据从表单存储到MongoDB数据库,我想创建定义的键值对,使排序更容易。

使用以下代码,我可以对一维数组执行此操作,但它不适用于多维数组:

/* $array = The array */
$new_array = array();
foreach ($array as $key => $value) {
    array_push($new_array, array(
        'name' => $key,
        'value' => $value
    ));
}

例子:

输入数组:

Array
(
    [email] => test@mail.com
    [name] => John
    [sports] => Array
        (
            [outdoor] => Array
                (
                    [0] => Football
                    [1] => Baseball
                )
            [indoor] => Array
                (
                    [0] => Basketball
                    [1] => Hockey
                )
        )
)

输出数组:

Array
(
    [0] => Array
        (
            [name] => email
            [value] => test@mail.com
        )
    [1] => Array
        (
            [name] => name
            [value] => John
        )
    [2] => Array
        (
            [name] => sports
            [value] => Array
                (
                    [outdoor] => Array
                        (
                            [0] => Football
                            [1] => Baseball
                        )
                    [indoor] => Array
                        (
                            [0] => Basketball
                            [1] => Hockey
                        )
                )
        )
)

注意它是如何在运动值数组处停下来,并且不改变其中的数组的。如何在其中的所有数组中延续这种模式?

你可以使用递归:

function keyValue($array){
  $new_array = array();
  foreach ($array as $key => $value) {
      array_push($new_array, array(
          'name' => $key,
          'value' => is_array($value) ? keyValue($value) : $value
      ));
  }
  return $new_array;
}

试试这个:

$array = array(
    'email' => 'test@email.com',
    'name' => 'John',
    'sport' => array('Soccor', 'Hockey')
);
$func = function($value, $key) {
     $return = array();
     $return['name'] = $key;
     $return['value'] = $value;

    return $return;
};
$parsed = array_map($func, $array, array_keys($array));

对于我,这返回:

   array(3) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "email"
    ["value"]=>
    string(14) "test@email.com"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(4) "name"
    ["value"]=>
    string(4) "John"
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(5) "sport"
    ["value"]=>
    array(2) {
      ["outdoor"]=>
      array(2) {
        [0]=>
        string(8) "Football"
        [1]=>
        string(8) "Baseball"
      }
      ["indoor"]=>
      array(2) {
        [0]=>
        string(10) "Basketball"
        [1]=>
        string(6) "Hockey"
      }
    }
  }
}

将关联数组转换为JSON对象(StdClass)非常简单,反之亦然,保留本机数据类型(int, float, bool)。这是我的尝试:

To Key-Value Array

function toKeyValue($values)
{
    $result = [];
    foreach ($values as $key => $value)
    {
        if (is_array($value)) {
            $result[$key] = toKeyValue($value);
        } elseif (is_object($value)) {
            $result[$key] = toKeyValue((array) $value);
        } else {
            $result[$key] = $value;
        }
    }
    return $result;
}

到JSON对象

function toJson($values)
{
   return json_decode(json_encode($values));
}

$values应该总是一个数组。