2

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

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

我可以通过循环和计数器来实现,但我认为会有更清洁的方法?

谢谢

4

5 回答 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;
}
于 2012-06-19T06:49:24.390 回答
1
$res = array();
foreach(explode("\n\n", implode("\n", $arr)) as $k => $v) {
  $res[$k] = explode("\n", $v);
}

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

于 2012-06-19T07:14:08.840 回答
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

于 2012-06-19T06:54:29.313 回答
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;
}
于 2012-06-19T06:57:32.820 回答
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;
}
于 2012-06-19T16:17:06.837 回答