遇到空元素时启动一个新的子数组,将平面数组拆分为二维数组

问题描述 投票:0回答:5

我正在寻找类似于

array_chunk()
但使用空值作为分隔符的内容。

我有:

Array
(
    [0] => /some/path:
    [1] => file.csv
    [2] => file.dat
    [3] => 
    [4] => /some/other/path:
    [5] => file.csv
    [6] => file.csv.gz
    [7] => file.dat
    [8] => 
    [9] => /some/other/other/path:
    [10] => file.csv
    [11] => file.dat
)

并希望实现 -

Array
(
    [0] => Array
        (
            [0] => /some/path:
            [1] => file.csv
            [2] => file.dat
        )

    [1] => Array
        (
            [0] => /some/other/path:
            [1] => file.csv
            [2] => file.csv.gz
            [3] => file.dat
        )

    [2] => Array
        (
            [0] => /some/other/other/path:
            [1] => file.csv
            [2] => file.dat
        )
)

注意,我不能只按每 3 个进行分块,因为您可以看到某些位置将有超过 1 个文件。

我可以通过循环和计数器实现,但我希望有一个更干净的方法?

php arrays grouping
5个回答
2
投票

我能想到的最好的方法是这个循环,我认为它非常干净:

/**
 * @param array  $inputArr  The array you wish to split.
 * @param string $splitStr  The string you wish to split by.
 *
 * @return array
 */
function split_arrays($inputArr, $splitStr) {
    $outputArr = array();
    $i         = 0;
    foreach ($inputArr as $data) {
        if ($data == $splitStr) {
            $i++;
            continue;
        }
        $outputArr[$i][] = $data;
    }
    return $outputArr;
}

我想到的另一种方法也使用循环,但不太干净。它搜索下一个分割字符串的索引并断开该块。

/**
 * @param array  $inputArr  The array you wish to split.
 * @param string $splitStr  The string you wish to split by.
 *
 * @return array
 */
function split_arrays2($inputArr,$splitStr) {
    $outputArr = array(); $i=0;
    while(count($inputArr)) {
        $index = array_search($splitStr,$inputArr)
        if($index === false) $index = count($inputArr);
        $outputArr[$i++] = array_slice($inputArr,0,$index);
        $inputArr = array_slice($inputArr,$index+1);
    }
    return $outputArr;
}

当且仅当您使用一个字符串作为分割字符串时,该字符串永远不会出现在其他字符串的中间(空间可能是也可能不是这种情况),那么我同意其他内爆和爆炸就简单多了。对于你的情况:

/**
 * @param array  $inputArr  The array you wish to split.
 * @param string $splitStr  The string you wish to split by.
 *
 * @return array
 */
function split_arrays3($inputArr,$splitStr) {
    $outputArr = array(); $i=0;
    $str = implode("|",$inputArr);
    $arr = explode("|$splitStr|");
    foreach($arr as $i=>$string)
        $outputArr[$i] = explode("|",$string);
    return $outputArr;
}

1
投票
$res = array();
foreach(explode("\n\n", implode("\n", $arr)) as $k => $v) {
  $res[$k] = explode("\n", $v);
}

$res
将包含您想要的数组。


0
投票

是否有两个字符肯定不会出现在数组字符串中? 如果是这样,假设它们是

#
;

我们将使用

implode
explode

的组合

然后:

$arrstring = implode(';',$old_array);   // Split via ; spearators
$arrstring = str_replace(';;','#',$arrstring); // If two ;; then mark end of array as #
$new_pre_array = explode('#',$arrstring); // Outer array

// Inner array
foreach($new_pre_array as $key => $entry) {
 $temp_sub_array = explode(';',$entry);
 $new_pre_array[$key] = $temp_sub_array;
}

return $new_pre_array;

参考: http://php.net/manual/en/function.explode.php http://php.net/manual/en/function.implode.php


0
投票
$chunked = chunkArray($your_array);


function chunkArray($array){
    $return = array();
    $index = 0;
    foreach($array as $ar){
        if($ar == "" or $ar == null){
            $index++;
        }
        else{
            $return[$index][] = $ar;
        }
    }
    return $return;
}

0
投票

我选择首先定位数组

$array
必须分割的位置:

$splitAt = array_keys($array, '', TRUE);

这其实是最神奇的。然后可以使用

array_splice
函数从输入数组中获取块,只是一个临时变量,我将其命名为
$last
:

$last = 0;

用于跟踪,因为长度不是位置。然后将这些

$splitAt
插入到

$result = array();

$result
数组:

foreach($splitAt as $pos) {
    $result[] = array_splice($array, 0, $pos - $last);
    unset($array[0]);
    $last += $pos + 1;
}

数组中剩余的块将被添加为最后一个元素:

$result[] = $array;

就是这样。完整示例(演示):

/**
 * explode array by delimiter
 *
 * @param mixed $delimiter
 * @param array $array
 * @return array
 */
function array_explode($delimiter, array $array)
{
    $splitAt = array_keys($array, $delimiter, TRUE);
    $last = 0;
    $result = array();
    foreach ($splitAt as $pos) {
        $result[] = array_splice($array, 0, $pos - $last);
        $array && unset($array[0]);
        $last += $pos + 1;
    }
    $result[] = $array;
    return $result;
}

# Usage:

var_dump(array_explode('', $array));

我将函数命名为

array_explode
,因为它在字符串上的作用类似于
explode
,但对于数组。

我看到的第二个选项(这可能是更好的选择)是循环数组并根据其值对其进行处理:要么添加到当前元素,要么将当前元素添加到其中:

/**
 * explode array by delimiter
 *
 * @param mixed $delimiter
 * @param array $array
 * @return array
 */
function array_explode($delimiter, array $array)
{
    $result[] = &$current;
    foreach($array as $value) {
        if ($value === $delimiter) {
            unset($current);
            $result[] = &$current;
            continue;
        }
        $current[] = $value;
    }
    return $result;
}
© www.soinside.com 2019 - 2024. All rights reserved.