按内部索引排列PHP多维数组

按内部索引排列PHP多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,如何按最后一个内部索引(0、1、2)排列此数组,并将最后一个内部索引的值作为每个第二个索引的值: Array ( [text] => Array ( [grid] => Array ( [0] => 3 [1] => 4 [2] => 5

如何按最后一个内部索引(0、1、2)排列此数组,并将最后一个内部索引的值作为每个第二个索引的值:

Array
(
    [text] => Array
        (
            [grid] => Array
                (
                    [0] => 3
                    [1] => 4
                    [2] => 5
                )

            [image] => Array
                (
                    [0] => 
                    [1] => 
                    [2] => 
                )

            [align] => Array
                (
                    [0] => left
                    [1] => right
                    [2] => left
                )

            [title] => Array
                (
                    [0] => 
                    [1] => 
                    [2] => 
                )

            [content] => Array
                (
                    [0] => 
                    [1] => 
                    [2] => 
                )

        )

)
结果如下:

Array
(
    [text] => Array
        (
            [0] => Array
                (
                    [grid] => 3
                    [image] => 
                    [align] => left
                    [title] => 
                    [content] => 
                )

            [1] => Array
                (
                    [grid] => 4
                    [image] => 
                    [align] => right
                    [title] => 
                    [content] => 
                )

            [2] => Array
                (
                    [grid] => 5
                    [image] => 
                    [align] => left
                    [title] => 
                    [content] => 
                )

        )

)
这应该行得通

function formatit($arr) {

  $new = array();

  foreach($arr as $k=>$v) {
    foreach($v as $k1=>$v1) {
     $new[$k1][$k] = $v1;
    }
  }
  return $new;
}
测试。称之为

$arr['text'] = formatit($arr['text']);

这应该行得通

function formatit($arr) {

  $new = array();

  foreach($arr as $k=>$v) {
    foreach($v as $k1=>$v1) {
     $new[$k1][$k] = $v1;
    }
  }
  return $new;
}
测试。称之为

$arr['text'] = formatit($arr['text']);

正如Sigateng所建议的,除了为/foreach循环使用
之外,我看不到其他方法:

function buildArray($source, $key = false)
{
    // Build the new array
    $new_array = array();
    // Define groups
    $groups = $key === false ? array_keys($source) : array($key);

    foreach($groups AS $group)
    {
        // Get the keys
        $keys = array_keys($array[$group]);
        // Count the values
        $num_entries = count($array[$group][$keys[0]]);

        for($i = 0; $i < $num_entries; $i++)
        {
            foreach($keys AS $key)
            {
                $new_array[$group][$i][$key] = $array[$group][$key][$i];
            }
        }
    }
    return $new_array;
}
函数buildArray($source,$key=false)
{
//构建新阵列
$new_array=array();
//定义组
$groups=$key==false?数组_键($source):数组($key);
foreach($组作为$组)
{
//拿到钥匙
$keys=array_keys($array[$group]);
//计算数值
$num_entries=count($array[$group][$keys[0]]);
对于($i=0;$i<$num_条目;$i++)
{
foreach($key作为$key)
{
$new_数组[$group][$i][$key]=$array[$group][$key][$i];
}
}
}
返回$new_数组;
}

这允许您定义需要构建的密钥;如果未指定,函数将为每个键构建数组。

正如Sigateng所建议的那样,除了为/foreach
循环之外,我看不到其他方法:

function buildArray($source, $key = false)
{
    // Build the new array
    $new_array = array();
    // Define groups
    $groups = $key === false ? array_keys($source) : array($key);

    foreach($groups AS $group)
    {
        // Get the keys
        $keys = array_keys($array[$group]);
        // Count the values
        $num_entries = count($array[$group][$keys[0]]);

        for($i = 0; $i < $num_entries; $i++)
        {
            foreach($keys AS $key)
            {
                $new_array[$group][$i][$key] = $array[$group][$key][$i];
            }
        }
    }
    return $new_array;
}
函数buildArray($source,$key=false)
{
//构建新阵列
$new_array=array();
//定义组
$groups=$key==false?数组_键($source):数组($key);
foreach($组作为$组)
{
//拿到钥匙
$keys=array_keys($array[$group]);
//计算数值
$num_entries=count($array[$group][$keys[0]]);
对于($i=0;$i<$num_条目;$i++)
{
foreach($key作为$key)
{
$new_数组[$group][$i][$key]=$array[$group][$key][$i];
}
}
}
返回$new_数组;
}
这允许您定义需要构建的密钥;如果未指定,函数将为每个键构建数组。

这将完成此工作

function restructure($arr){
    $newArr = array();
    foreach($arr as $k => $v){
        foreach($v as $k1 => $v1){
            foreach($v1 as $k2 => $v2){
                $newArr[$k][$k2][$k1] = $v2; 
            }
        }
    }
    return $newArr;
}
这就行了

function restructure($arr){
    $newArr = array();
    foreach($arr as $k => $v){
        foreach($v as $k1 => $v1){
            foreach($v1 as $k2 => $v2){
                $newArr[$k][$k2][$k1] = $v2; 
            }
        }
    }
    return $newArr;
}


您正在寻找一种单行程序解决方案吗?使用
foreach
index[0]在您的解决方案中的位置,可以肯定上面的内容很简单吗?您只扫描了1和2。通过创建一个新的结果数组并使用foreach($someArr as$key=>$value)@sigateng可以很容易地解决这类问题。我正在寻找一种更好的方法,通过子索引排列每个第一个数组。上面的示例使用0、1和2索引。最后一个子索引是从0开始到任意数字。@Erwin Moller。它从0开始。您是否正在寻找一个线性解决方案?使用
foreach
index[0]在您的解决方案中的位置,可以肯定上面的内容很简单吗?您只扫描了1和2。通过创建一个新的结果数组并使用foreach($someArr as$key=>$value)@sigateng可以很容易地解决这类问题。我正在寻找一种更好的方法,通过子索引排列每个第一个数组。上面的示例使用0、1和2索引。最后一个子索引是从0开始到任意数字。@Erwin Moller。它从0开始。然后也许你应该先测试它。@Truth-用你想要翻转为formatit的数组调用它($arr['text'])@法塔莱罗:那么你应该在你的回答中提到它,你不认为/它起作用了吗。。。但是,如果第一个索引发生变化,我想在不同的位置使用相同的函数,使用相同的数组结构,但不同的索引,那么您可能应该首先测试它。@Truth-使用您想要翻转为formatit的数组调用它($arr['text'])@法塔莱罗:那么你应该在你的回答中提到它,你不认为/它起作用了吗。。。但是如果第一个索引发生变化,我想在不同的位置使用相同的函数,使用相同的数组结构,但不同的索引该怎么办?您的输出与OP要求的不同,请阅读输出示例carefully@SiGanteng你说得对,我没有注意到第一个
text
索引,我的问题是“text”是第一级索引。如果有其他第一阶段数组索引,如“按钮”、“视频”等,该如何处理?@zourbuth这取决于您如何接收数组以及需要什么输出。
text
是静态键吗(您将始终查找并且仅查找
text
索引?)在我的示例中,我使用数组中的第一个键作为分组clause@Strae是的,你说得对。“文本”是第一维数组的唯一ID。谢谢。您的输出与OP要求的不同,请阅读输出示例carefully@SiGanteng你说得对,我没有注意到第一个
text
索引,我的问题是“text”是第一级索引。如果有其他第一阶段数组索引,如“按钮”、“视频”等,该如何处理?@zourbuth这取决于您如何接收数组以及需要什么输出。
text
是静态键吗(您将始终查找并且仅查找
text
索引?)在我的示例中,我使用数组中的第一个键作为分组clause@Strae是的,你说得对。“文本”是第一维数组的唯一ID。谢谢