Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据子数组重新分类父数组';Javascript中的s对象_Javascript_Php_Arrays - Fatal编程技术网

根据子数组重新分类父数组';Javascript中的s对象

根据子数组重新分类父数组';Javascript中的s对象,javascript,php,arrays,Javascript,Php,Arrays,(也对php解决方案开放) 如果数组中有一个数组,如何根据子数组的对象对父数组重新分类 以下是我想要实现的一个例子: 假设原始数组是: [ { "name":"Jade", "tags":[ "developer" ] }, { "name":"Bridge", "tags":[ "cook" ] }, { "name":"Ever", "tags":[ "artist" ] }, { "name":"Noah", "t

(也对php解决方案开放)

如果数组中有一个数组,如何根据子数组的对象对父数组重新分类

以下是我想要实现的一个例子:

假设原始数组是:

[
 {
  "name":"Jade",
  "tags":[
   "developer"
  ]
 },
 {
  "name":"Bridge",
  "tags":[
   "cook"
  ]
 },
 {
  "name":"Ever",
  "tags":[
   "artist"
  ]
 },
 {
  "name":"Noah",
  "tags":[
   "artist",
   "developer"
  ]
 }
]
我希望能够将其重新分类为:

[
 "artist": {
    {
     {
      "name":"Noah",
      "tags":[
       "artist",
       "developer"
      ]
    }
  }
 "developer": {
   {
      "name":"Jade",
      "tags":[
       "developer"
      ]
      },
     {
      "name":"Noah",
      "tags":[
       "artist",
       "developer"
      ]
    }
  },
  "cook": {
    {
      "name":"Bridge",
      "tags":[
       "cook"
      ]
    },
  }
]
以下是我尝试过的:

(原始数组是var数据)

var data=[原始数组]
var newArray=[];
对于(变量i=0;i
我的理论是将标记(在标记中)弹出到一个新数组中,如果原始object.tags与数组中的新对象具有相同的值,则将原始对象弹出到新对象中


这种方法失败了。

我推荐一种后端解决方案(php),因为它会随着您的扩展而显著加快

<?php
    $sInFile  = 'in.json';
    $sOutFile = 'out.json';

    $aDevelopers = array();
    $aArtists    = array();
    $aCooks      = array();

    $sRaw       = file_get_contents( $sInFile );
    $aInData    = json_decode( $sRaw );
    $iCountData = count( $aInData );
    for( $i = 0; $i < $iCountData; ++$i )
    {
        $iCountTags = count( $aInData[ $i ]->tags );
        for( $j = 0; $j < $iCountTags; ++$j )
        {
            $aTmp = array();
            if( ( !empty( $aInData[ $i ]->tags[ $j ] ) ) && $aInData[ $i ]->tags[ $j ] == 'developer' )
            {
                $aTmp[ 'name' ] = $aInData[ $i ]->name;
                $aTmp[ 'tags' ] = $aInData[ $i ]->tags;
                $aDevelopers[] = $aTmp;
            }
            $aTmp = array();
            if( ( !empty( $aInData[ $i ]->tags[ $j ] ) ) && $aInData[ $i ]->tags[ $j ] == 'artist' )
            {
                $aTmp[ 'name' ] = $aInData[ $i ]->name;
                $aTmp[ 'tags' ] = $aInData[ $i ]->tags;
                $aArtists[] = $aTmp;
            }
            $aTmp = array();
            if( ( !empty( $aInData[ $i ]->tags[ $j ] ) ) && $aInData[ $i ]->tags[ $j ] == 'cook' )
            {
                $aTmp[ 'name' ] = $aInData[ $i ]->name;
                $aTmp[ 'tags' ] = $aInData[ $i ]->tags;
                $aCooks[] = $aTmp;
            }
        }
    }

    $aFull[ 'developer'] = $aDevelopers;
    $aFull[ 'artist' ] = $aArtists;
    $aFull[ 'cook' ] = $aCooks;
    $sFull = json_encode( $aFull );
    file_put_contents( $sOutFile, $sFull );
?>


您的代码看起来像javascript。在上面有一个对象数组。因此,您将需要使用对象方法。@对不起。我希望通过前端实现,但是如果通过php更容易实现,我可以设置后端来解释这个API。谢谢。你的预期结果的例子是坏的,也有点奇怪。您肯定希望每个作业都包含一个对象数组?(人)?@rjdown正确。我注意到我的解决方案既不干净也不高效。我对一种更智能的方法持开放态度。看起来随着标签数量的增加,我需要手动创建新的数组类别。实际上,大约有数百个这样的标签,我认为手动创建所有这些标签将变得难以管理。转换为动态职业检测阵列?:)您可以调整脚本,使其在创建临时占位符时具有唯一的数组,并在将数据提交给专业之前存储它们。
<?php
    $sInFile  = 'in.json';
    $sOutFile = 'out.json';

    $aDevelopers = array();
    $aArtists    = array();
    $aCooks      = array();

    $sRaw       = file_get_contents( $sInFile );
    $aInData    = json_decode( $sRaw );
    $iCountData = count( $aInData );
    for( $i = 0; $i < $iCountData; ++$i )
    {
        $iCountTags = count( $aInData[ $i ]->tags );
        for( $j = 0; $j < $iCountTags; ++$j )
        {
            $aTmp = array();
            if( ( !empty( $aInData[ $i ]->tags[ $j ] ) ) && $aInData[ $i ]->tags[ $j ] == 'developer' )
            {
                $aTmp[ 'name' ] = $aInData[ $i ]->name;
                $aTmp[ 'tags' ] = $aInData[ $i ]->tags;
                $aDevelopers[] = $aTmp;
            }
            $aTmp = array();
            if( ( !empty( $aInData[ $i ]->tags[ $j ] ) ) && $aInData[ $i ]->tags[ $j ] == 'artist' )
            {
                $aTmp[ 'name' ] = $aInData[ $i ]->name;
                $aTmp[ 'tags' ] = $aInData[ $i ]->tags;
                $aArtists[] = $aTmp;
            }
            $aTmp = array();
            if( ( !empty( $aInData[ $i ]->tags[ $j ] ) ) && $aInData[ $i ]->tags[ $j ] == 'cook' )
            {
                $aTmp[ 'name' ] = $aInData[ $i ]->name;
                $aTmp[ 'tags' ] = $aInData[ $i ]->tags;
                $aCooks[] = $aTmp;
            }
        }
    }

    $aFull[ 'developer'] = $aDevelopers;
    $aFull[ 'artist' ] = $aArtists;
    $aFull[ 'cook' ] = $aCooks;
    $sFull = json_encode( $aFull );
    file_put_contents( $sOutFile, $sFull );
?>