使用分隔符将数组拆分为块

时间:2012-06-19 06:42:42

标签: php

希望每个人都做得很好......

我正在寻找与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个文件。

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

由于

5 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

答案 2 :(得分:0)

你有两个不会出现在数组字符串中的字符吗? 如果是这样,假设它们是#;

我们将使用implodeexplode

的组合

然后:

$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

答案 3 :(得分: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;
}

答案 4 :(得分: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;

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

/**
 * 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;
}