我正在寻找类似于
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 个文件。
我可以通过循环和计数器实现,但我希望有一个更干净的方法?
我能想到的最好的方法是这个循环,我认为它非常干净:
/**
* @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;
}
$res = array();
foreach(explode("\n\n", implode("\n", $arr)) as $k => $v) {
$res[$k] = explode("\n", $v);
}
$res
将包含您想要的数组。
是否有两个字符肯定不会出现在数组字符串中? 如果是这样,假设它们是
#
和 ;
我们将使用
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
$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;
}
我选择首先定位数组
$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;
}