2012-06-19 44 views
1

希望大家都做的很好...拆分數組,使用隔板塊

我正在尋找類似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個文件。

我可以通過循環和計數器實現,但我覺得會有一個更清潔的方法?

感謝

+1

凡你從這個數組中獲取?也許有比這更好的解決方案。 –

+0

@Jack它來自ftp_nlist('/ some/path/*'),它以上述格式返回數組。 – mybigman

回答

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

我認爲第一個和第三個是最乾淨的......並且非常感謝,因爲我會完成所有人的輸入/代碼。 謝謝 – mybigman

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; 
} 
1
$res = array(); 
foreach(explode("\n\n", implode("\n", $arr)) as $k => $v) { 
    $res[$k] = explode("\n", $v); 
} 

$res將包含你想要的數組。

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對字符串而是數組。

我看到(和可能是preferrable)第二個選擇是環陣列和過程在它根據它的值:要麼添加到當前元素或添加當前它:

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