Hice la codificación de la siguiente manera y obtuve el resultado incorrecto:
$asst_vicars_data_arr=explode(',',$asst_vicars_data); $asst_head_type_count=count($asst_vicars_data_arr); $d = explode("|",$data); foreach ($asst_vicars_data_arr as $value) { $arr = explode("|",$value); print_r($arr); }Aporte:
$asst_vicars_data_arr=Array ( [0] => PT|1 [1] => O|4 [2] => PT|15,... )Rendimiento esperado:
$type=Array([0] => PT, [1] => O,...) $heads=Array([0] => 1, [1] => 4,...)¿Qué puedo hacer para crear estas dos matrices?
Espero que esto te ayude. Aquí estoy usando explode para romper una cadena y un bucle foreach .
Pruebe este fragmento de código aquí
<?php ini_set('display_errors', 1); $asst_vicars_data_arr=Array ( 0 => "PT|1", 1 => "O|4", 2 => "PT|15", 3 =>"1|6"); $types=array(); $heads=array(); foreach($asst_vicars_data_arr as $value) { list($types[],$heads[])=explode("|",$value); } print_r($types); print_r($heads);En esencia, esta pregunta es un ejercicio de conversión de cadena a matriz. En lugar de hacer un montón de explode() , investiguemos un par de métodos que harán menos llamadas a funciones iteradas...
Método n. ° 1 : una sola línea usando preg_match() y list()
preg_match_all('/([^|]+)\|([^,]+),?/',$asst_vicars_data,$m)?list(,$type,$heads)=$m:null; // output: $type=array(0=>'PT', 1=>'O', 2=>'PT') // output: $heads=array(0=>'1', 1=>'4', 2=>'15') Método #2 : 3 líneas usando preg_split() , array_chunk() y array_column()
$asst_vicars_data='PT|1,O|4,PT|15'; $a=array_chunk(preg_split('/,|\|/',$asst_vicars_data),2); $type=array_column($a,0); // output: array(0=>'PT', 1=>'O', 2=>'PT') $heads=array_column($a,1); // output: array(0=>'1', 1=>'4', 2=>'15') Mi primer método utiliza un patrón de expresiones regulares ajustadas para extraer los valores que list() establece fácilmente en variables. La coma inicial de list() significa que al primer subarreglo (las cadenas completas) de $m no se le asignará un nombre de variable.
Mi segundo método usa un patrón de expresiones regulares ajustadas para explotar la cadena en tuberías y comas en el mismo paso. array_chunk() pone los elementos en pares. Finalmente array_column() obtiene los valores "verticales" en la matriz.
Todas las demás respuestas actualmente en esta página usan llamadas de explode() en cada iteración. Este enfoque se vuelve cada vez más ineficiente a medida que crece el tamaño de la entrada. Por esta razón, será más eficiente llevar a cabo toda la explosión/división una vez y avanzar desde allí.
El método #1 es claramente mi método favorito para este caso; Solo quería mostrar el Método #2 como una alternativa que también disecciona la cuerda una sola vez antes de procesar las piezas.
Aquí hay algunos métodos adicionales que se comportan como los bucles foreach en otras respuestas (también sufren la misma ineficiencia porque llaman a explode() en cada iteración):
array_map() se puede usar para escribir una pequeña y agradable frase:
$asst_vicars_data='PT|1,O|4,PT|15'; array_map(function($a)use(&$type,&$heads){list($type[],$heads[])=explode('|',$a);},explode(',',$asst_vicars_data)); var_export($type); var_export($heads); La misma historia con array_walk() pero con una línea extra de código:
$asst_vicars_data='PT|1,O|4,PT|15'; $asst_vicars_data_arr=explode(',',$asst_vicars_data); array_walk($asst_vicars_data_arr,function($a)use(&$type,&$heads){list($type[],$heads[])=explode('|',$a);}); var_export($type); var_export($heads);