How to convert string to array character

The first line of code is converted to the second code. I can use fill methods, but I want to get the solution from the shortest path and convert it quickly. I will use the code field in the sql select section

 $ it = "(a (am, bam), b (dam, cam))";
 $ to = "a.am, a.bam, b.dam, b.cam";
+3


source to share


3 answers


Try the following code:

$it = "(a(am,bam),b(dam,cam))";

function iDelimiter( $str ) {

    $count = 0;
    $str = str_split( $str );

    foreach( $str as &$value ) {

        if( $value == "(" ) {
            $count++;
        } elseif( $value == ")" ) {
            $count--;
        }

        if( $value == "," && ! $count ) {
            $value = "|";
        }

    }

    return explode( "|", implode( $str ) );

}

function iParser( $str, $_prefix = "" ) {

    preg_match( "/^((?!(\(|\))).)*\((.*)\)$/", $str, $m );

    if( count( $m ) < 4 ) {
        return ( strlen( $_prefix ) ? $_prefix . "." : '' ) . $str;
    }

    $prefix = ( strlen( $_prefix ) ? $_prefix . "." : '' ) . $m[1];

    $str = $m[3];

    if( strpos( $str, "(" ) === false ) {

        $return = explode( ",", $str );

        $pad = preg_filter( '/^/', strlen( $prefix ) ? $prefix . '.' : '', $return );

        return implode( $pad, "," );
    } else {

        $str = iDelimiter( $str );

        $return = array_map( 'iParser', $str, array_pad( array(), count( $str ), $prefix ) );

        return implode( $return, ", " );
    }

}

print_r( iParser( $it ) );

      



It parses every depth of parentheses. Just pass the string to iParser

.

+5


source


Try the following:

<?php

function str2Arr( $s, $r, $str) {

  $str = trim( str_replace( $s, $r, $str ));
  return explode(" ", $str);
}

$it = "(a(am,bam),b(dam,cam))";
//$to = "a.am, a.bam, b.dam, b.cam";


$search = ['),', '(',  ')', ',', 'a a', 'b d', 'ba', 'c'];

$replace =[' ',  ' ',  ' ', ' ', 'a.a','b.d', 'a.ba', 'b.c'];

var_dump( implode(", ",( str2Arr( $search, $replace, $it) ) ) );

      



See demo

Without using a regular expression, the specified transformation can be achieved using str_replace (), which uses a character array to replace with another character array if found in the subject line. Non-alphabetic characters are replaced with white space, and substrings are replaced so that each starts with "a" or "b" as needed, followed by a period and the rest of the substring.

+2


source


Kill me now. There must be a better way, but my eyes are bleeding.

It would probably be much better if I started with a regex, but my regex skills are rusty.

I kept hitting your data with a hammer until the square peg went through the round hole.

<?php

 $it = "(a(am,bam),b(dam,cam))";
 $it = substr($it, 1, -1);
 //$to = "a.am, a.bam, b.dam, b.cam";

$final = [];

$test = explode("),", $it);
foreach($test as $section) {
    $letter = substr($section, 0, 1);
    $remainder = substr($section, 2);
    if(strpos($remainder, ")")) {
        $remainder = substr($remainder, 0, strpos($remainder, ")"));
    }
    echo $letter . " ".$remainder."\n";
    foreach(explode(",", $remainder) as $fragment) {
        array_push($final, $letter.".".$fragment);
    }
}

var_dump($final);

var_dump(implode($final, ", "));

      

Yield

a am,bam
b dam,cam
array(4) {
  [0]=>
  string(4) "a.am"
  [1]=>
  string(5) "a.bam"
  [2]=>
  string(5) "b.dam"
  [3]=>
  string(5) "b.cam"
}
string(22) "a.am, a.bam, b.dam, b.cam"

      

0


source







All Articles