php - 如何在 PHP 中解码 json 字符串并添加到数组

标签 php mysql recursion

我从数据库中有一些记录,并且获取了所有记录。数组返回如下代码

array (size=10)
  0 => 
    array (size=5)
      'id' => string '1' (length=1)
      'type' => string 'group' (length=5)
      'members' => null
      'parents' => string '0' (length=1)
      'level' => string '1' (length=1)
  1 => 
    array (size=5)
      'id' => string '2' (length=1)
      'type' => string 'group' (length=5)
      'members' => null
      'parents' => string '0' (length=1)
      'level' => string '1' (length=1)
  2 => 
    array (size=5)
      'id' => string '3' (length=1)
      'type' => string 'team' (length=4)
      'members' => string '["3","5","6"]' (length=13)
      'parents' => string '1' (length=1)
      'level' => string '2' (length=1)
  3 => 
    array (size=5)
      'id' => string '4' (length=1)
      'type' => string 'team' (length=4)
      'members' => string '["1"]' (length=5)
      'parents' => string '1' (length=1)
      'level' => string '2' (length=1)
  4 => 
    array (size=5)
      'id' => string '5' (length=1)
      'type' => string 'group' (length=5)
      'members' => null
      'parents' => string '1' (length=1)
      'level' => string '2' (length=1)
  5 => 
    array (size=5)
      'id' => string '8' (length=1)
      'type' => string 'team' (length=4)
      'members' => string '["4"]' (length=5)
      'parents' => string '5' (length=1)
      'level' => string '3' (length=1)
  6 => 
    array (size=5)
      'id' => string '9' (length=1)
      'type' => string 'team' (length=4)
      'members' => string '["2"]' (length=5)
      'parents' => string '5' (length=1)
      'level' => string '3' (length=1)
  7 => 
    array (size=5)
      'id' => string '10' (length=2)
      'type' => string 'team' (length=4)
      'members' => null
      'parents' => string '5' (length=1)
      'level' => string '3' (length=1)
  8 => 
    array (size=5)
      'id' => string '11' (length=2)
      'type' => string 'team' (length=4)
      'members' => null
      'parents' => string '5' (length=1)
      'level' => string '3' (length=1)
  9 => 
    array (size=5)
      'id' => string '12' (length=2)
      'type' => string 'group' (length=5)
      'members' => null
      'parents' => string '1' (length=1)
      'level' => string '2' (length=1)

成员字段已编码为 json 字符串。我想构建一个格式如下的数组

 array('1'=>array(1,2,3,4,5,6),
       '2'=>array(),
       '3'=>array(3,5,6),
       '4'=>array(1),
       '5'=>array(2,4),
       '8'=>array(4),
       '9'=>array(2))

记录的id将成为数组的键,解码后的成员将成为值。我写了一个函数处理从数据库返回的数组,但结果并不符合我的意图。这是我的代码

$results = mysql_query('select id,type,members,parents,level from team'); 
$array = array();
recursiveDate($results,0,$array);

function recursiveData($sourceArr,$parents = 0, &$newMenu){
        if(count($sourceArr)>0){
            foreach ($sourceArr as $key => $value){
                if($value['parents'] == $parents){
                    if(isset($newMenu[$value['id']])){
                        $newMenu[$value['id']] = array(); 
                    }   
                    $newMenu[$value['id']]  = $value['members']?json_decode($value['members']):array();
                    if(isset($newMenu[$parents])){
                        $newMenu[$parents] = array_merge($newMenu[$value['id']],$newMenu[$parents]);
                    }


                    $newParents = $value['id'];
                    unset($sourceArr[$key]);
                    $this->recursiveData($sourceArr,$newParents, $newMenu);
                }
            }
        }
    }

这是处理后的数组

array (size=10)
  1 => 
    array (size=4)
      0 => string '1' (length=1)
      1 => string '3' (length=1)
      2 => string '5' (length=1)
      3 => string '6' (length=1)
  3 => 
    array (size=3)
      0 => string '3' (length=1)
      1 => string '5' (length=1)
      2 => string '6' (length=1)
  4 => 
    array (size=1)
      0 => string '1' (length=1)
  5 => 
    array (size=2)
      0 => string '2' (length=1)
      1 => string '4' (length=1)
  8 => 
    array (size=1)
      0 => string '4' (length=1)
  9 => 
    array (size=1)
      0 => string '2' (length=1)
  10 => 
    array (size=0)
      empty
  11 => 
    array (size=0)
      empty
  12 => 
    array (size=0)
      empty
  2 => 
    array (size=0)
      empty

请帮我构建该数组

最佳答案

我很快就写了这篇文章,所以不确定它是否正是您正在寻找的内容,但看起来您把它弄得太复杂了。我保留了原始结果结构,以防您需要,但如果您愿意,您可以轻松覆盖它。

function modifyData($data = array()) {
    foreach($data as &$entry) {
        if(!empty($entry['members'])) {
            $entry['members'] = json_decode($entry['members'], true);
        } else {
            $entry['members'] = array();
        }
    }
    return $data;
}

我测试了这个

$data = array(
    array(
        'id' =>'1',
        'type' =>'group',
        'members' => null,
        'parents' =>'0',
        'level' =>'1'
    ),
    array(
        'id' =>'1',
        'type' =>'group',
        'members' => '["3","5","6"]',
        'parents' =>'0',
        'level' =>'1'
    ),
    array(
        'id' =>'1',
        'type' =>'group',
        'members' => '["3"]',
        'parents' =>'0',
        'level' =>'1'
    )
);

输出是

array (size=3)
  0 => 
    array (size=5)
      'id' => string '1' (length=1)
      'type' => string 'group' (length=5)
      'members' => 
        array (size=0)
          empty
      'parents' => string '0' (length=1)
      'level' => string '1' (length=1)
  1 => 
    array (size=5)
      'id' => string '1' (length=1)
      'type' => string 'group' (length=5)
      'members' => 
        array (size=3)
          0 => string '3' (length=1)
          1 => string '5' (length=1)
          2 => string '6' (length=1)
      'parents' => string '0' (length=1)
      'level' => string '1' (length=1)
  2 => 
    array (size=5)
      'id' => string '1' (length=1)
      'type' => string 'group' (length=5)
      'members' => 
        array (size=1)
          0 => string '3' (length=1)
      'parents' => string '0' (length=1)
      'level' => string '1' (length=1)

关于php - 如何在 PHP 中解码 json 字符串并添加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664831/

相关文章:

php - 如何用PHP调用UploadHandler.php - blueimp jQuery File Upload

PHP [QUERY_STRING] 在回车处被截断

java - 递归的结果是如何产生的?

java - 任何人都可以想出一种方法来打印此模式而不在方法之外存储数据吗?

java - 递归得到n的回文

php - 将选定的复选框下拉值发送到 Codeigniter 中的 MySQL 表

php - 在网站上显示 JSON 数据

mysql - R- SQLDF - 选择...案例...结束

mysql - SQL 查询 - 找出一行从 0 变为另一个值的次数

java - JPA 标准 API : Aggregating on Multiple Columns with IF Condition