如何修剪空白的数组值在php

我有一个数组如下所示

$fruit = array('  apple ','banana   ', ' , ',     '            cranberry ');

我想要一个数组,其中包含的值没有空白两侧,但它可以包含空值如何在php中做到这一点。输出数组应该是这样的

$fruit = array('apple','banana', ',', 'cranberry');
214695 次浏览

<强>到< / >强< >强修剪< / >强可以完成这项工作

$trimmed_array = array_map('trim', $fruit);
print_r($trimmed_array);
$fruit= array_map('trim', $fruit);

array_walk()可以和trim()一起使用来修饰数组

<?php
function trim_value(&$value)
{
$value = trim($value);
}


$fruit = array('apple','banana ', ' cranberry ');
var_dump($fruit);


array_walk($fruit, 'trim_value');
var_dump($fruit);


?>

参见第二个例子http://www.php.net/manual/en/function.trim.php

function trimArray(&$value)
{
$value = trim($value);
}
$pmcArray = array('php ','mysql ', ' code ');
array_walk($pmcArray, 'trimArray');

通过使用array_walk函数,我们可以从数组元素中删除空格,元素返回相同数组中的结果。

在使用多维数组时,我遇到了现有答案的麻烦。这个解决办法对我很管用。

if (is_array($array)) {
foreach ($array as $key => $val) {
$array[$key] = trim($val);
}
}

如果数组是多维的,这将工作得很好:

//trims empty spaces in array elements (recursively trim multidimesional arrays)
function trimData($data){
if($data == null)
return null;


if(is_array($data)){
return array_map('trimData', $data);
}else return trim($data);
}

一个例子是这样的:

$arr=[" aaa ", " b  ", "m    ", ["  .e  ", "    12 3", "9 0    0 0   "]];
print_r(trimData($arr));
//RESULT
//Array ( [0] => aaa [1] => b [2] => m [3] => Array ( [0] => .e [1] => 12 3 [2] => 9 0 0 0 ) )
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}


function generateRandomSpaces() {
$output = '';
$i = rand(1, 10);
for ($j = 0; $j <= $i; $j++) {
$output .= " ";
}


return $output;
}


// Generating an array to test
$array = [];
for ($i = 0; $i <= 1000; $i++) {
$array[] = generateRandomSpaces() . generateRandomString(10) . generateRandomSpaces();
}


// ARRAY MAP
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$trimmed_array=array_map('trim',$array);
}
$time = (microtime(true) - $start);
echo "Array map: " . $time . " seconds\n";


// ARRAY WALK
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
array_walk($array, 'trim');
}
$time = (microtime(true) - $start);
echo "Array walk    : " . $time . " seconds\n";


// FOREACH
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
foreach ($array as $index => $elem) {
$array[$index] = trim($elem);
}
}
$time = (microtime(true) - $start);
echo "Foreach: " . $time . " seconds\n";


// FOR
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
for ($j = 0; $j < count($array) - 1; $j++) {
$array[$j] = trim($array[$j]);
}
}
$time = (microtime(true) - $start);
echo "For: " . $time . " seconds\n";

上面代码的输出是:

数组映射:8.6775720119476秒
数组walk: 10.423238992691秒
Foreach: 7.3502039909363秒
对于:9.8266389369965秒

这个值当然可能会改变,但我想说foreach是最好的选择。

array_map('trim', $data)将所有子数组转换为null。如果只需要为字符串修剪空格,而保持其他类型不变,你可以使用:

$data = array_map(
function ($item) {
return is_string($item) ? trim($item) : $item;
},
$data
);

如果值为NULL,则在array_map中修改类型。

更好的做法是:

$result = array_map(function($v){
return is_string($v)?trim($v):$v;
}, $array);

如果你想装饰和印刷一维数组或多维数组的最深维度,你应该使用:

foreach($array as $key => $value)
{
$array[$key] = trim($value);
print("-");
print($array[$key]);
print("-");
print("<br>");
}

如果你想修剪但不想打印一维数组或多维数组的最深维度,你应该使用:

$array = array_map('trim', $array);

Multidimensional-proof解决方案:

array_walk_recursive($array, function(&$arrValue, $arrKey){ $arrValue = trim($arrValue);});

简单地说,您可以使用正则表达式修剪所有空格或缩小数组项

$array = array_map(function ($item) {
return preg_replace('/\s+/', '', $item);
}, $array);

如果你不想丢失一个关联数组的元素,不要使用array_walkarray_map!

一个略短版本的foreach解决方案:

foreach($array as &$val)
$val = trim($val);

这适用于关联数组。

function trim_value(&$value)
{
$value = trim($value);
}
    

    

// ut_sreco_dis Module
public function disExcelUpload($file=""){
    

ini_set('MAX_EXECUTION_TIME', -1);
ini_set('memory_limit', '-1');
    

$file_upload    = $file;
    

if (isset($file_upload) && !empty($file_upload)){
    

//You can add directly the Composer Autoloder in your controller:
require FCPATH . 'vendor/autoload.php';
    

try{
$objPHPExcel = PHPExcel_IOFactory::load($file_upload);
}
catch (Exception $e){
die('Error loading file "' . pathinfo($file_upload, PATHINFO_BASENAME) . '": '.@$e->getMessage());
}
    

$allDataInSheet         = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
$sheet                  = $objPHPExcel->getSheet(0);
$highestRow             = $sheet->getHighestRow();
$highestCol             = $sheet->getHighestColumn();
$highestco              = $sheet->getHighestDataColumn();
$arrayCount             = count($allDataInSheet);
$now                    = date("Y-m-d H:i:s");
$flag = 0;
    

$check_template = array(
'A' => 'FIN_ID',
'B' => 'SECCODE',
'C' => 'SCHEME_NO',
'D' => 'SEC_SCH',
'E' => 'DISNO',
'F' => 'DISQTY',
'G' => 'BILLQTY',
'H' => 'BILLREF',
'I' => 'BILLDT',
);
    

$input_template = $allDataInSheet[1];
    

array_walk($input_template, $this->trim_value);
    

$result = array_diff($check_template, $input_template);
    

if(empty($result))
{
$this->srObject->truncTableDis();
    

# loop for inserting data
for ($i = 2,$j=0; $i <= $highestRow; $i++){
    

$db_ch_ot = 64;
    

$fin_id         = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$sec_code       = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$sch_no         = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$sec_sch        = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$dis_no         = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$dis_qty        = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$bill_qty       = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$bill_ref       = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$bill_dt        = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
    

if(empty($bill_dt)){
$bill_dt = null;
}else{
$dip_dt = date("Y-m-d",strtotime($bill_dt));
}
    

$dt             = date('Y-m-d H:i:s');
                    

$insert_data = array(
"fin_id_data"           => $fin_id,
"sec_code_data"         => $sec_code,
"sch_no_data"           => $sch_no,
"sec_sch_data"          => $sec_sch,
"dis_no_data"           => $dis_no,
"dis_qty_data"          => $dis_qty,
"bill_qty_data"         => $bill_qty,
"bill_ref_data"         => $bill_ref,
"bill_dt_data"          => $bill_dt,
"created_at_data"       => $dt,
"updated_at_data"       => $dt,
);
                    

if($this->srObject->insertSdisData($insert_data))
{
++$flag;
}
    

    

} //loop close
} else {
$this->session->set_flashdata('error', 'Error. Invalid Excel Template');
redirect(site_url('schill-bill-checking-suuti/sreco'));
}
    

$this->session->set_flashdata('success', 'File Uploaded Successfully ..'.' New Record Inserted : '.$flag);
redirect(site_url('schill-bill-checking-suuti/sreco'));
    

            

}
        

}
function trim_value(&$value)
{
$value = trim($value);
}




// ut_sreco_dis Module
public function disExcelUpload($file=""){


ini_set('MAX_EXECUTION_TIME', -1);
ini_set('memory_limit', '-1');


$file_upload    = $file;


if (isset($file_upload) && !empty($file_upload)){


//You can add directly the Composer Autoloder in your controller:
require FCPATH . 'vendor/autoload.php';


try{
$objPHPExcel = PHPExcel_IOFactory::load($file_upload);
}
catch (Exception $e){
die('Error loading file "' . pathinfo($file_upload, PATHINFO_BASENAME) . '": '.@$e->getMessage());
}


$allDataInSheet         = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
$sheet                  = $objPHPExcel->getSheet(0);
$highestRow             = $sheet->getHighestRow();
$highestCol             = $sheet->getHighestColumn();
$highestco              = $sheet->getHighestDataColumn();
$arrayCount             = count($allDataInSheet);
$now                    = date("Y-m-d H:i:s");
$flag = 0;


$check_template = array(
'A' => 'FIN_ID',
'B' => 'SECCODE',
'C' => 'SCHEME_NO',
'D' => 'SEC_SCH',
'E' => 'DISNO',
'F' => 'DISQTY',
'G' => 'BILLQTY',
'H' => 'BILLREF',
'I' => 'BILLDT',
);


$input_template = $allDataInSheet[1];


array_walk($input_template, $this->trim_value);


$result = array_diff($check_template, $input_template);


if(empty($result))
{
$this->srObject->truncTableDis();


# loop for inserting data
for ($i = 2,$j=0; $i <= $highestRow; $i++){


$db_ch_ot = 64;


$fin_id         = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$sec_code       = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$sch_no         = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$sec_sch        = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$dis_no         = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$dis_qty        = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$bill_qty       = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$bill_ref       = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);
$bill_dt        = trim($allDataInSheet[$i][chr(++$db_ch_ot)]);


if(empty($bill_dt)){
$bill_dt = null;
}else{
$dip_dt = date("Y-m-d",strtotime($bill_dt));
}


$dt             = date('Y-m-d H:i:s');
                

$insert_data = array(
"fin_id_data"           => $fin_id,
"sec_code_data"         => $sec_code,
"sch_no_data"           => $sch_no,
"sec_sch_data"          => $sec_sch,
"dis_no_data"           => $dis_no,
"dis_qty_data"          => $dis_qty,
"bill_qty_data"         => $bill_qty,
"bill_ref_data"         => $bill_ref,
"bill_dt_data"          => $bill_dt,
"created_at_data"       => $dt,
"updated_at_data"       => $dt,
);
                

if($this->srObject->insertSdisData($insert_data))
{
++$flag;
}




} //loop close
} else {
$this->session->set_flashdata('error', 'Error. Invalid Excel Template');
redirect(site_url('schill-bill-checking-suuti/sreco'));
}


$this->session->set_flashdata('success', 'File Uploaded Successfully ..'.' New Record Inserted : '.$flag);
redirect(site_url('schill-bill-checking-suuti/sreco'));


        

}
    

}