开发者

take indexes between repeated values

开发者 https://www.devze.com 2023-03-30 19:19 出处:网络
how can I get everything from a repeated index and the other in an array? see: $Produtos = Array(\'Guitarra\' , // repeats

how can I get everything from a repeated index and the other in an array? see:

$Produtos = Array(  'Guitarra' , // repeats
                       'Bateria' ,  // repeats
                       'Piano' ,  
                  开发者_如何转开发     'Baixo' , 
                       'Guitarra' ,  // repeats
                       'Violão' , 
                       'Caixas de Som' ,
                       'Bateria' , // repeats
                       'Sanfona' );

Reviewed are the indices that are repeated, as I do to get what's between them? I wish to return:`

Array
(

    [0] => Array( 
              [0] => Piano
              [1] => Baixo
    [1] => Array( 
              [0] => Violão
              [1] => Caixas de Som
    [2] => Array( 
              [0] => Sanfona
    ) )       


It can be solved like this:

<?php
<?php

$Produtos = Array(  'Guitarra' , // repeats
                       'Bateria' ,  // repeats
                       'Piano' ,
                       'Baixo' ,
                       'Guitarra' ,  // repeats
                       'Violão' ,
                       'Caixas de Som' ,
                       'Bateria' , // repeats
                       'Sanfona' );


$countedProducts = array_count_values($Produtos);

$c = 0;
foreach ($Produtos as $product)
{
    if ($countedProducts[$product] > 1)
    {
        if (count($novosProdutos))
        {
            $c++;
        }
    }else{
        $novosProdutos[$c][] = $product;
    }
}

print '<pre>';
var_dump($novosProdutos);
print '</pre>';

?>

Output:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "Piano"
    [1]=>
    string(5) "Baixo"
  }
  [1]=>
  array(2) {
    [0]=>
    string(7) "Violão"
    [1]=>
    string(13) "Caixas de Som"
  }
  [2]=>
  array(1) {
    [0]=>
    string(7) "Sanfona"
  }
}

I have understood in the meantime, what you really wanted to have as an result. I changed it now, and it work also with multiple repeations and starts always from zero.


$finalProducts = array();
$currentKey = 0;
$wordCount = array_count_values($Produtos);
foreach($Produtos as $val) {
    if($wordCount[$val] > 1) {
        $currentKey++;
    }
    elseif(strlen($currentKey) > 0) {
        $finalProducts[$currentKey][] = $val;
    }
}
$finalProducts = array_values($finalProducts);


<?php

function array_between_duplicates($ary)
{
  // first, tally up all the values
  // we need to know how many times each value repeats
  $count = array_count_values($ary);

  // next, we want only the values that are not repeated.
  // This can be done by filtering the array for values
  // present 2+ times
  $between = array_filter($count, create_function('$a','return $a==1;'));

  // now that we have the unique values, swap the keys
  // and value locations using array_keys
  $swap = array_keys($between);

  // and then intersect the new array with the original
  // array so we can get back their original key values.
  $intersect = array_intersect($ary, $swap);
  var_dump($intersect);

  // now, in order to get the nested groups we will use
  // skipped keys as a sign that the in-between values
  // were repeats. So, iterate over the array and break
  // out these groups
  $result = array(); $group = array();
  foreach ($ary as $key => $value)
  {
    if (!array_key_exists($key, $intersect) && count($group) > 0)
    {
      $result[] = $group;
      $group = array();
    }

    if (array_search($value,$intersect) !== false)
      $group[] = $value;
  }
  if (count($group) > 0)
    $result[] = $group;

  // return the result
  return $result;
}

var_dump(array_between_duplicates($Produtos));

Results in:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "Piano"
    [1]=>
    string(5) "Baixo"
  }
  [1]=>
  array(2) {
    [0]=>
    string(7) "Violão"
    [1]=>
    string(13) "Caixas de Som"
  }
  [2]=>
  array(1) {
    [0]=>
    string(7) "Sanfona"
  }
}

DEMO

0

精彩评论

暂无评论...
验证码 换一张
取 消