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つごとにチャンクすることはできません。

ループとカウンターを介して達成できますが、よりクリーンな方法があると思いましたか?

ありがとう

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

私が考えたもう1つの方法もループを使用しますが、それほどクリーンではありません。次の分割文字列のインデックスを検索し、そのチャンクを分割します。

/**
 * @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

配列文字列に確実に出現しない2つの文字がありますか?もしそうなら、彼らがそうであると仮定し#;

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に機能するが、配列に対して機能するためです。

私が見る2番目のオプション(そしてそれは好ましいかもしれません)は、配列をループし、その値に従ってそれを処理することです:現在の要素に追加するか、それに電流を追加します:

/**
 * 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 に答える