-3

Hi I need help in removing values from an array using a recursive function

$array = [0] => testing,testing1
[1] => testing,testing1,testing2
[2] => testing,testing1,testing2,testing3
[3] => testing,testing1,testing2,testing3,tesing4
[4] => testing,testing1,testing2,testing3,tesing4
[5] => testing,testing1,testing2,testing3,tesing4
[6] => testing,testing1,testing2,testing3,tesing4
[7] => testing,testing1,testing2,testing3,tesing4

I need to check the array count, ie if count(array[0]) == count(array[1]),then reutrn array else unset(array[value]);

From the above array I have to remove array[0],[1],[2] and return rest of the array values.

I've tried the below code

$idx =10;
$separtor =',';
function array_delete($idx, $array,$separtor) {
  $finalvalue = array();
for ($i = 0; $i < $idx; $i++) {
   $values = explode($separtor, $array[$i]);
   $valuesnext = explode($separtor, $array[$i+1]);
       if(count($values) != count($valuesnext) )
       {
            unset($array[$i]);
           // reset($array);
           // array_delete($idx, $array,$separtor);
            if (is_array($array)) $array = array_delete($idx, $array,$separtor);
            $finalvalue =  $array;
       }else
       {

       }
    //echo $i;

}
return $finalvalue;
//(is_array($array)) ? array_values($array) : null;
//array_delete($idx, $array,$separtor);
}

I'm getting Notice: Undefined offset: 0 when trying calling recursive, going to infinite loop

4

3 回答 3

1

如果我理解正确,您希望过滤数组,使最终数组中的任何值与源数组中的最后一个元素的长度相同。为了避免在迭代数组时对其进行变异,此技术会使用符合您的条件的元素构建一个新数组。

$matchLength = count($mainArray[count($mainArray) - 1]);
$resultArray = array();
for($i = 0; $i < count($mainArray); $i++) {
    if(count($mainArray[$i]) == $matchLength) {
        $resultArray[] = $mainArray[$i];
    }
}

如果您碰巧使用的是 PHP 5.3 或更高版本,则可以使用闭包和 array_filter 更快地完成此操作:

$matchLength = count($mainArray[count($mainArray) - 1]);
$resultArray = array_filter($mainArray, function($element){return count($element) == $matchLength});

仔细检查代码,我最近没有写 PHP,所以这只是一个想法。

于 2012-06-19T03:35:30.207 回答
1

根据您给出的描述,可以直接制作(检查当前和前一个的计数,如果它们不匹配,则删除前一个)。

示例/演示

unset($prevKey);
$count = array();
foreach (array_keys($array) as $key) {
    $count[$key] = count($array[$key]);
    if (isset($prevKey) && $count[$prevKey] !== $count[$key]) {
        unset($array[$prevKey]);
    }
    $prevKey = $key;
}

如果您需要重新迭代以考虑删除,那么一点 goto 可以完成工作Demo

start:
######
unset($prevKey);
$count = array();
foreach (array_keys($array) as $key) {
    $count[$key] = count($array[$key]);
    if (isset($prevKey) && $count[$prevKey] !== $count[$key]) {
        unset($array[$prevKey]);
        goto start;
        ###########
    }
    $prevKey = $key;
}
于 2012-06-19T19:19:56.140 回答
1

你想保留拥有最多项目的子数组吗?你的描述似乎是这样说的。

如果是这样,类似以下内容就足够了。

// Get maximum number of items in the arrays
$max_count = max(array_map('count', $array));

// Keep only those arrays having $max_count items
$filtered  = array_filter($array, function ($a) use ($max_count) {
    return count($a) === $max_count;
});

另外:如果您需要过滤后的数组具有从零开始的键,请调用array_values()它。

请参阅在线运行的示例

于 2012-06-20T09:51:11.647 回答