将自定义顺序应用于多维数组

时间:2012-09-18 12:42:45

标签: php

我有这个数组

$arr = array(
    'one' => array(
    'slidertitle' => 'lorem ipsum',
    'sliderlocation' => 'http://localhost/images/1.jpg',
    'sliderdescription' => 'this is a good lorem ipsum image',
    'sliderposition' => 1
    ),
    'two' => array(
    'slidertitle' => 'second slider',
    'sliderlocation' => 'http://localhost/images/2.jpg',
    'sliderdescription' => 'this space was reserved for a link source code here',
    'sliderposition' => 2
    ),
    'six' => array(
    'slidertitle' => 'sixth slider',
    'sliderlocation' => 'http://localhost/images/6.jpg',
    'sliderdescription' => 'this is the sixth slider,like,really!',
    'sliderposition' => 6
    )
);

我需要看起来像这样

$arr = array(

     'two' => array(
    'slidertitle' => 'second slider',
    'sliderlocation' => 'http://localhost/images/2.jpg',
    'sliderdescription' => 'this space was reserved for a link source code here',
    'sliderposition' => 2
    ),

    'six' => array(
    'slidertitle' => 'sixth slider',
    'sliderlocation' => 'http://localhost/images/6.jpg',
    'sliderdescription' => 'this is the sixth slider,like,really!',
    'sliderposition' => 6
    ),
      'one' => array(
    'slidertitle' => 'lorem ipsum',
    'sliderlocation' => 'http://localhost/images/1.jpg',
    'sliderdescription' => 'this is a good lorem ipsum image',
    'sliderposition' => 1
    )
);

我试图通过定义预期的数组结构并引入一个虚拟数组来做到这一点。然后我将数组块化并将每个块合并为数组格式,我计划最终取消设置虚拟数据,我留下了数组i希望并按照我想要的顺序。

$arrayFormat = array(
   'dummy' => array(
    'slidertitle' => 'xxxx',
    'sliderlocation' => 'xxxxxxx',
    'sliderdescription' => 'xxxxxx',
    'sliderposition' => 0
    )
);
$arrayLength = count($arr);
$afterChunk = array_chunk($arr,$arrayLength);
$one = $afterChunk[0][0];
$two = $afterChunk[0][1];
$mergedArray = array_merge($arrayFormat,$one);
$secondMergedArray = array_merge($mergedArray,$two);
echo '<pre>';
print_r($secondMergedArray);
echo '</pre>';

问题是array_chunk()不包括数组的键,所以我得到了

Array (
    [dummy] => Array
        (
            [slidertitle] => xxxx
            [sliderlocation] => xxxxxxx
            [sliderdescription] => xxxxxx
            [sliderposition] => 0
        )

    [slidertitle] => second slider
    [sliderlocation] => http://localhost/images/2.jpg
    [sliderdescription] => this space was reserved for a link source code here
    [sliderposition] => 2 )

当我print_r($secondMergedArray);。是否可以对array_chunk()进行包含数组键的操作,还是有任何其他数组函数可以帮助我获得包含密钥的单个数组? / p>

2 个答案:

答案 0 :(得分:2)

在如何对元素进行排序方面,很难说出你想要的是什么。你在这个问题上并不是很清楚。数组中必须有一些东西,你知道它需要什么样的顺序。

如果没有任何线索,我会假设你想手动指定数组键的顺序。

因此,当前数组为array('one'=>... , 'two'=>... , 'six'=>... ),您希望按照要手动指定的顺序对这些键进行排序。

解决方案是使用uksort()函数以及指定排序顺序的单独数组:

$arr = ... //input array as specified in the question
$sortOrder = array('two','one','six');

uksort($arr, function ($a, $b) use ($sortOrder) {
    $sortMe = array_flip($sortOrder);
    if ($sortMe[$a] == $sortMe[$b]) { return 0; }
    return ($sortMe[$a] < $sortMe[$b]) ? -1 : 1;
});

print_r($arr);

以“两个”,“一个”,“六个”顺序输出数组。根据需要更改$sortOrder数组。

希望有所帮助。

注意:我上面提供的语法仅适用于PHP 5.3及更高版本。 (如果您使用的是旧版本,则需要升级)

答案 1 :(得分:1)

使用uksort()获取多维数组的自定义顺序

http://php.net/manual/en/function.uksort.php