php - 将数组重新排列成组

时间:2015-03-12 09:31:37

标签: php arrays

我有一个文件名数组:

 Array
(
    [2] => 1_1_page2-img1.jpg
    [3] => 1_2_page2-img1-big.jpg
    [4] => 2_1_page2-img1.jpg
    [5] => 2_2_page2-img1-big.jpg
    [6] => 3_1_page2-img1.jpg
    [7] => 4_1_page2-img1.jpg
    [8] => 4_2_page2-img1.jpg
    [9] => 5_2_page2-img1.jpg
)

我正在尝试重新安排它们,以便它们按照第一个数字组合在一起。我猜我可以将它们用管子分开,这样我就可以在之后区分它们。要么是多维数组,要么是多维数组。

我知道我可以执行explode("_",$filename);来获取下划线之前的第一个和第二个数字。

即使起始数字应该总是递增,但每个初始数字不一定会有2个文件。

所以我要么试着把它变成以下内容:

Array
    (
        [0] => 1_1_page2-img1.jpg|1_2_page2-img1-big.jpg
        [1] => 2_1_page2-img1.jpg|2_2_page2-img1-big.jpg
        [2] => 3_1_page2-img1.jpg|
        [3] => 4_1_page2-img1.jpg|4_2_page2-img1.jpg
        [4] => |5_2_page2-img1.jpg
    )
或者或许有点整洁的东西?我无法解决foreach将它们组合在一起。

或者是否有一个与数组相关的命令可以将它们放在一起更容易?

4 个答案:

答案 0 :(得分:0)

我的偏好是将它们存储在子阵列中,因为从长远来看这将更容易处理;所以这是可能的,因为你的数组在$arr

$newarr = array ();
while (list($key, $val) = each($arr)) {

    $subarray_index = substr($val, 0, strpos($val, "_"));
    $newarr[$subarray_index][] =  $val;
}

答案 1 :(得分:0)

这是你的意思吗?

$arr = Array(
2 => '1_1_page2-img1.jpg',
3 => '1_2_page2-img1-big.jpg',
4 => '2_1_page2-img1.jpg',
5 => '2_2_page2-img1-big.jpg',
6 => '3_1_page2-img1.jpg',
7 => '4_1_page2-img1.jpg',
8 => '4_2_page2-img1.jpg',
9 => '5_2_page2-img1.jpg'
);


function orderArray($pArr){
    $first = '0';
    $newArr = array();
    foreach($pArr as $val){
      if(strpos($val,$first) !== 0){
         if(substr($val,2,1)==='1'){
           $newArr[]=$val;
         }else{
           $newArr[]='|'.$val;
         }
         $first = substr($val,0,1);
      }else{
         $curIndex = count($newArr) - 1;
         $newArr[$curIndex] = $newArr[$curIndex].'|'.$val;
      }
      return $newArr;
    }

$result = orderArray($arr);

print "number of values: ".count($result)."<br>";
foreach($result as $value){
    print $value."<br>";
}

答案 2 :(得分:0)

现在根据stackoverflow中的另一篇文章解决它:

foreach ($scanned_directory as $filename){
        $ids = explode("_",$filename);
        $groups[$ids[0]][] = $filename;     
    }
    echo "<pre>";
    ksort($groups);
    print_r($groups);
    echo "</pre>";

显示器:

Array
(
    [1] => Array
        (
            [0] => 1_1_page2-img1.jpg
            [1] => 1_2_page2-img1-big.jpg
        )

    [2] => Array
        (
            [0] => 2_1_page2-img1.jpg
            [1] => 2_2_page2-img1-big.jpg
        )

    [3] => Array
        (
            [0] => 3_1_page2-img1.jpg
            [1] => 3_2_page2-img1-big.jpg
        )

    [10] => Array
        (
            [0] => 10_1_page2-img1.jpg
        )

    [11] => Array
        (
            [0] => 11_2_page2-img1-big.jpg
        )

)

答案 3 :(得分:0)

没有一种很好的自动化方法,但你可以使用一个简单的循环:

$array = [];

foreach ($filename as $file) {
    $fields = explode('_', $file);
    $array[$fields[0]][$fields[1]] = $file;
}

一个例子是located here