I want to filter a string and make an array using php

This is my example line (this has five words, in practice there may be more):

$str = "I want to filter it";

      

The result I want is:

$output[1] = array("I","want","to","filter","it");
$output[2] = array("I want","want to","to filter","filter it");
$output[3] = array("I want to","want to filter","to filter it");
$output[4] = array("I want to filter","want to filter it");
$output[5] = array("I want to filter it");  

      

What I am trying:

$text = trim($str);
$text_exp = explode(' ',$str);
$len = count($text_exp);
$output[$len][] = $text;  // last element
$output[1] = $text_exp;  // first element

      

This gives me the first and last arrays. How can I get all the average arrays?

+3


source to share


3 answers


a more general solution that works with any long word:



$output = array();

$terms = explode(' ',$str);
for ($i = 1; $i <= count($terms); $i++ )
{
    $round_output = array();
    for ($j = 0; $j <= count($terms) - $i; $j++)
    {
        $round_output[] = implode(" ", array_slice($terms, $j, $i));
    }
    $output[] = $round_output;
}

      

+2


source


You can do this easily with regular expressions, which provide the most flexibility. Below is a way that maintains dynamic line length and multiple white characters between words, and also only does one loop, which should make it more efficient for long lines.



<?php
$str = "I want to filter it";
$count = count(preg_split("/\s+/", $str));
$results = [];

for($i = 1; $i <= $count; ++$i) {
    $expr = '/(?=((^|\s+)(' . implode('\s+', array_fill(0, $i, '[^\s]+')) . ')($|\s+)))/';
    preg_match_all($expr, $str, $matches);
    $results[$i] = $matches[3];
}

print_r($results);

      

+1


source


You can use a single loop and if the conditions are met

$str = "I want to filter it"; 

$text = trim($str);
$text_exp = explode(' ',$str);
$len = count($text_exp);

$output1=$text_exp;
$output2=array();
$output3=array();
$output4=array();
$output5=array();
for($i=0;$i<count($text_exp);$i++)
{
    if($i+1<count($text_exp) && $text_exp[$i+1]!='')
    {
        $output2[]=$text_exp[$i].' '.$text_exp[$i+1];
    }

    if($i+2<count($text_exp) && $text_exp[$i+2]!='')
    {
        $output3[]=$text_exp[$i].' '.$text_exp[$i+1].' '.$text_exp[$i+2];
    }
    if($i+3<count($text_exp) && $text_exp[$i+3]!='')
    {
        $output4[]=$text_exp[$i].' '.$text_exp[$i+1].' '.$text_exp[$i+2].' '.$text_exp[$i+3];
    }
    if($i+4<count($text_exp) && $text_exp[$i+4]!='')
    {
        $output5[]=$text_exp[$i].' '.$text_exp[$i+1].' '.$text_exp[$i+2].' '.$text_exp[$i+3].' '.$text_exp[$i+4];
    }

}

      

0


source







All Articles