【问题标题】:Create a new array from an existing array based on a key基于键从现有数组创建新数组
【发布时间】:2012-02-14 21:08:52
【问题描述】:

我有一个如下的数组,它是一个一维数组。我想使用产品键作为值从这个数组创建一个二维数组。

如何创建这样的多维数组?

   Array
(
    [0] => Array
        (
            [0] => God 
            [listitemname] => God 
            [1] => 20a3208eca59
            [upload_key] => 20a3208eca59
            [2] => d296772dd9045b1d99e0ff5a
            [file_key] => d296772dd9045b1d99e0ff5a
            [3] => a4e4eb6d7621e585d66b424ece08
            [folderkey] => a4e4eb6d7621e585d66b424ece08
            [4] => d9ef5a3cacbc
            [productkey] => d9ef5a3cacbc
            [5] => 1
            [file_type] => 1
        )

    [1] => Array
        (
            [0] => God 
            [listitemname] => God 
            [1] => 877ede85abd9
            [upload_key] => 877ede85abd9
            [2] => 5a769542b3f75c78a6fd9bda
            [file_key] => 5a769542b3f75c78a6fd9bda
            [3] => dfcc7d5523de534dd1d148a67f6f
            [folderkey] => dfcc7d5523de534dd1d148a67f6f
            [4] => d9ef5a3cacbc
            [productkey] => d9ef5a3cacbc
            [5] => 2
            [file_type] => 2
        )

    [2] => Array
        (
            [0] => God 
            [listitemname] => God 
            [1] => 32d8dbdb7d31
            [upload_key] => 32d8dbdb7d31
            [2] => 413057623b1d11617e4eba71
            [file_key] => 413057623b1d11617e4eba71
            [3] => 3cd3bab180cc1ce6350ec6b29c46
            [folderkey] => 3cd3bab180cc1ce6350ec6b29c46
            [4] => d9ef5a3cacbc
            [productkey] => d9ef5a3cacbc
            [5] => 4
            [file_type] => 4
        )

    [3] => Array
        (
            [0] => God 
            [listitemname] => God 
            [1] => 93854a71f69e
            [upload_key] => 93854a71f69e
            [2] => ddd697e3ec13dd49a987f17b
            [file_key] => ddd697e3ec13dd49a987f17b
            [3] => e41ff80e0a18b6cb4cf874730b52
            [folderkey] => e41ff80e0a18b6cb4cf874730b52
            [4] => d9ef5a3cacbc
            [productkey] => d9ef5a3cacbc
            [5] => 5
            [file_type] => 5
        )

    [4] => Array
        (
            [0] => Games
            [listitemname] => Games
            [1] => 17eec2f803be
            [upload_key] => 17eec2f803be
            [2] => 54f74c98ecb267ee5da74da1
            [file_key] => 54f74c98ecb267ee5da74da1
            [3] => dc035e3347f429f4b12d1af00d7a
            [folderkey] => dc035e3347f429f4b12d1af00d7a
            [4] => 4c8a0251e489
            [productkey] => 4c8a0251e489
            [5] => 1
            [file_type] => 1
        )

    [5] => Array
        (
            [0] => Games
            [listitemname] => Games
            [1] => df9c2041eff0
            [upload_key] => df9c2041eff0
            [2] => d65e22242ca45cbf935af4b9
            [file_key] => d65e22242ca45cbf935af4b9
            [3] => 45f1ace431926347aa1fcf1ae2c6
            [folderkey] => 45f1ace431926347aa1fcf1ae2c6
            [4] => 4c8a0251e489
            [productkey] => 4c8a0251e489
            [5] => 2
            [file_type] => 2
        )

    [6] => Array
        (
            [0] => Games
            [listitemname] => Games
            [1] => 934380f97ae1
            [upload_key] => 934380f97ae1
            [2] => 684505352bb62e8c61ea8c8c
            [file_key] => 684505352bb62e8c61ea8c8c
            [3] => 2b86c8f004f97bad9600f0e23eed
            [folderkey] => 2b86c8f004f97bad9600f0e23eed
            [4] => 4c8a0251e489
            [productkey] => 4c8a0251e489
            [5] => 4
            [file_type] => 4
        )

    [7] => Array
        (
            [0] => Games
            [listitemname] => Games
            [1] => c85be159256e
            [upload_key] => c85be159256e
            [2] => eee3f59502b57e07fd83a9b1
            [file_key] => eee3f59502b57e07fd83a9b1
            [3] => 9ec2158c662b2c0068308bc461fa
            [folderkey] => 9ec2158c662b2c0068308bc461fa
            [4] => 4c8a0251e489
            [productkey] => 4c8a0251e489
            [5] => 5
            [file_type] => 5
        )

)

我想得到一个二维数组,将所有产品键作为键,将对应的记录作为值,如下所示

    Array
(
    [d9ef5a3cacbc] => Array{
        [0](
            [0] => God 
            [listitemname] => God 
            [1] => 20a3208eca59
            [upload_key] => 20a3208eca59
            [2] => d296772dd9045b1d99e0ff5a
            [file_key] => d296772dd9045b1d99e0ff5a
            [3] => a4e4eb6d7621e585d66b424ece08
            [folderkey] => a4e4eb6d7621e585d66b424ece08
            [4] => d9ef5a3cacbc
            [productkey] => d9ef5a3cacbc
            [5] => 1
            [file_type] => 1
        )
    [1] (
            [0] => God 
            [listitemname] => God 
            [1] => 877ede85abd9
            [upload_key] => 877ede85abd9
            [2] => 5a769542b3f75c78a6fd9bda
            [file_key] => 5a769542b3f75c78a6fd9bda
            [3] => dfcc7d5523de534dd1d148a67f6f
            [folderkey] => dfcc7d5523de534dd1d148a67f6f
            [4] => d9ef5a3cacbc
            [productkey] => d9ef5a3cacbc
            [5] => 2
            [file_type] => 2
        )
    [2]        (
            [0] => God 
            [listitemname] => God 
            [1] => 32d8dbdb7d31
            [upload_key] => 32d8dbdb7d31
            [2] => 413057623b1d11617e4eba71
            [file_key] => 413057623b1d11617e4eba71
            [3] => 3cd3bab180cc1ce6350ec6b29c46
            [folderkey] => 3cd3bab180cc1ce6350ec6b29c46
            [4] => d9ef5a3cacbc
            [productkey] => d9ef5a3cacbc
            [5] => 4
            [file_type] => 4
        )
    [3] (
            [0] => God 
            [listitemname] => God 
            [1] => 93854a71f69e
            [upload_key] => 93854a71f69e
            [2] => ddd697e3ec13dd49a987f17b
            [file_key] => ddd697e3ec13dd49a987f17b
            [3] => e41ff80e0a18b6cb4cf874730b52
            [folderkey] => e41ff80e0a18b6cb4cf874730b52
            [4] => d9ef5a3cacbc
            [productkey] => d9ef5a3cacbc
            [5] => 5
            [file_type] => 5


    }

    [4c8a0251e489] => Array{
        [0](
            [0] => Games
            [listitemname] => Games
            [1] => 17eec2f803be
            [upload_key] => 17eec2f803be
            [2] => 54f74c98ecb267ee5da74da1
            [file_key] => 54f74c98ecb267ee5da74da1
            [3] => dc035e3347f429f4b12d1af00d7a
            [folderkey] => dc035e3347f429f4b12d1af00d7a
            [4] => 4c8a0251e489
            [productkey] => 4c8a0251e489
            [5] => 1
            [file_type] => 1
        )
    [1] (
[0] => Games
            [listitemname] => Games
            [1] => 934380f97ae1
            [upload_key] => 934380f97ae1
            [2] => 684505352bb62e8c61ea8c8c
            [file_key] => 684505352bb62e8c61ea8c8c
            [3] => 2b86c8f004f97bad9600f0e23eed
            [folderkey] => 2b86c8f004f97bad9600f0e23eed
            [4] => 4c8a0251e489
            [productkey] => 4c8a0251e489
            [5] => 4
            [file_type] => 4
        )
    [2]        (
            [0] => Games
            [listitemname] => Games
            [1] => c85be159256e
            [upload_key] => c85be159256e
            [2] => eee3f59502b57e07fd83a9b1
            [file_key] => eee3f59502b57e07fd83a9b1
            [3] => 9ec2158c662b2c0068308bc461fa
            [folderkey] => 9ec2158c662b2c0068308bc461fa
            [4] => 4c8a0251e489
            [productkey] => 4c8a0251e489
            [5] => 5
            [file_type] => 5
        )

}

【问题讨论】:

  • 这不是一维数组
  • 其实已经是二维数组了
  • 是的,我觉得你的例子有点不靠谱......
  • 所以你想通过productkeys 对内部数组进行分组?

标签: php arrays multidimensional-array


【解决方案1】:

不确定您尝试了什么,但这看起来可以满足您的需要。

$res = array();

// assuming you want an array by product key
foreach($outer as $inner)
{
    $key = $inner['productKey'];
    if(!isset($res[$key]))
        $res[$key] = array();
    $res[$key][] = $inner;
}
// $res now holds what you're looking for

现在,您似乎正在寻找稍微复杂一点的东西:

function not_numeric($a){return !is_numeric($a);}

// you only care about the non-numeric keys of the arrays.
$keys = array_map('not_numeric', array_keys($outer[0]));
$res = array();
foreach($keys as $key)
{
   // same idea as above, only nested this time.
   if(!isset($res[$key]))
       $res[$key] = array();
   // this is exactly the same as the first example, only with an additional
   // lookup. You can make this better by judicious use of references, but
   // that is an exercise up to the reader.
   foreach($outer as $inner)
   {
        $inKey = $inner[$key];
        if(!isset($res[$key][$inKey]))
            $res[$key][$inKey] = array();
        $res[$key][$inKey][] = $inner;
   }
}

// $res now holds what you're looking for

作为一个观察,这种结构非常低效,虽然可以通过添加引用等来改进它,但您可能需要重新考虑您的数据结构。

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多