2013-04-15 2 views
2

Не могли бы вы помочь мне найти массив для десятичных чисел или его частей, например ". " (точка и пробел после него) и заменить его нулями или удалить точку?Как заменить числа в массиве в php

Ниже часть массива:

Array ([2] => AUD,ADF,1,06-01-2001,3.,3.9532 
     [3] => AUD,ADP,1,06-02-2001,99.8222,99.6682 
     [4] => AUD,AED,1,06-01-2001,1.8687,1.8664 
     [5] => AUD,AFA,1,06-01-2001,2416.57,2413.95 
     [6] => AUD,AFN,1,06-01-2001,2416.57,2413.95 
     [7] => AUD,ALL,1,06-01-2001,77.,75.9759 
     [8] => AUD,AMD,1,06-03-2001,NULL,NULL 
     [9] => AUD,ANG,1,06-01-2001,0.9056,0.9046 
     [10] => AUD,AOA,1,06-01-2001,3.0751,2.9961 
     [11] => 

Пожалуйста, посмотрите на [7] есть номер, как 77. или по адресу [2] есть 3. (после точки нет ничего).

ответ

4

Использование preg_replace():

$array = array(
    'AUD,ADF,1,06-01-2001,3.,3.9532', 
    'AUD,ADP,1,06-02-2001,99.8222,99.6682', 
    'AUD,ALL,1,06-01-2001,77.,75.9759', 
    'AUD,ALL,1,06-01-2001,78. ,75.9759' 
); 
//       ----RegEx Pattern--- Replace Input 
//       \/  \/  \/ \/  \/ 
$new_array = preg_replace('/(\d+)\.(\s*)(?!\d)/', '$1', $array); 
//       ^^^ ^^ ^^^^ ^^^^ 
//       | | | | 
// Match any digits [0-9] <---| | | | 
//   Match a point <-------| | | 
// Match spaces and make it optional<-- | 
//           | 
// Lookahead, which means that if there <--| 
// is no digits after:     <--| 
// digit[point][0 or several spaces] <--| 
// The whole thing won't be matched. <--| 

// Addition: the first (\d+) is the first match group 
// That's why we used $1 in replace ! 

// \d -> [0-9] 
// \s -> space 
// \. -> points have to be escaped 
// (?!) -> Lookbehind (check : http://php.net/manual/en/regexp.reference.assertions.php) 
// * -> Occurs 0 time or plus 
// + -> occurs 1 time or plus 
// The '/' at the begin and the end are delimiters 

print_r($new_array); 

Выход:

Array 
(
    [0] => AUD,ADF,1,06-01-2001,3,3.9532 
    [1] => AUD,ADP,1,06-02-2001,99.8222,99.6682 
    [2] => AUD,ALL,1,06-01-2001,77,75.9759 
    [3] => AUD,ALL,1,06-01-2001,78,75.9759 
) 

EDIT: Чтобы ответить на этот вопрос, который в комментарии ниже:

Регулярные выражения все о Закономерности. Из желаемого результата я вижу, что вы хотите поместить все в кавычки, кроме чисел (integer и double/float), у нас также есть даты, чтобы заключить между кавычками. Так вот способ сделать это:

$new_array = preg_replace('/(\d+)\.(\s*)(?!\d)/', '$1', $array); // remove some dots & spaces 
$new_array_2 = preg_replace('/([a-zA-Z]+|\d+-\d+-\d+)/', '\'$1\'', $new_array); 
//   Match letters <--^-^-^-^-^ ^-^-^-^-^---> Match digits-digits-digits (for the date part), I don't want to use a LOOOONG RegEx to check if it's valid ... 

print_r($new_array); // First replacement 
print_r($new_array_2); // Second replacement 

Существует другой более надежный способ сделать это, используя некоторые PHP-Fu:

$new_array = preg_replace('/(\d+)\.(\s*)(?!\d)/', '$1', $array); // remove some dots & spaces 
// For this code YOU NEED PHP 5.3+ since it's using anonymous functions 
$new_array_2 = array_map(function($val){ 
    $pieces = explode(',', $val); 
    $pieces2 = array_map(function($val2){ 
     if(preg_match('/^\d+(\.\d+)?$/', $val2)){ 
      return $val2; 
     }else{ 
      return "'$val2'"; 
     } 
    }, $pieces); 
    return(implode(',',$pieces2)); 
}, $new_array); 

print_r($new_array); 
print_r($new_array_2); 

Выход:

Array 
(
    [0] => AUD,ADF,1,06-01-2001,3,3.9532 
    [1] => AUD,ADP,1,06-02-2001,99.8222,99.6682 
    [2] => AUD,ALL,1,06-01-2001,77,75.9759 
    [3] => AUD,ALL,1,06-01-2001,78,75.9759 
) 
Array 
(
    [0] => 'AUD','ADF',1,'06-01-2001',3,3.9532 
    [1] => 'AUD','ADP',1,'06-02-2001',99.8222,99.6682 
    [2] => 'AUD','ALL',1,'06-01-2001',77,75.9759 
    [3] => 'AUD','ALL',1,'06-01-2001',78,75.9759 
) 
+1

OP попросил также удалить пробелы. –

+1

+1 для космоса '. ' –

+0

@AndreyVolk Спасибо, я отредактировал мое регулярное выражение :) – HamZa

1

Вы можете использовать intval() для преобразования с плавающей точки в целых числах: http://php.net/manual/en/function.intval.php Похоже, вы, возможно, придется разделить значения (через запятую), преобразование их, а затем присоединиться к ним снова ...

+1

Это не то, что просят. –

+0

Вот как я понимаю вопрос, хотя –

+0

Я вижу, что вы имеете в виду, мой плохой. Preg_replace - это то, что вы хотите, тогда –

0

Вы для этого нужно использовать array_walk() и preg_replace(). Выражение для регулярных выражений должно быть что-то вроде [\ s]

1

Использование str_replace, вы можете пройти полный массив в качестве входных данных (.):

$ J = массива ('AUD, ADF, 1,06 -01-2001,3., 3,9532' , 'AUD, АДФ, 1,06-02-2001,99.8222,99.6682', 'AUD, AED, 1,06-01-2001,1.8687,1.8664', 'AUD, AFA, 1,06-01-2001,2416.57,2413.95' , 'AUD, AFN, 1,06-01-2001,2416.57,2413.95', 'AUD, ALL, 1,06-01-2001,77., 75,9759 ' 'AUD, AMD, 1,06-03-2001, NULL, NULL', 'AUD, ANG, 1,06-01-2001,0.9056,0.9046',' AUD, АОА, 1,06-01-2001 , 3.0751,2.9961');

$ j = str_replace (".,", ",", $ J);

print_r ($ j);

Выход

Array 
(
[0] => AUD,ADF,1,06-01-2001,3,3.9532 
[1] => AUD,ADP,1,06-02-2001,99.8222,99.6682 
[2] => AUD,AED,1,06-01-2001,1.8687,1.8664 
[3] => AUD,AFA,1,06-01-2001,2416.57,2413.95 
[4] => AUD,AFN,1,06-01-2001,2416.57,2413.95 
[5] => AUD,ALL,1,06-01-2001,77,75.9759 
[6] => AUD,AMD,1,06-03-2001,NULL,NULL 
[7] => AUD,ANG,1,06-01-2001,0.9056,0.9046 
[8] => AUD,AOA,1,06-01-2001,3.0751,2.9961 
) 
+0

что abo ut точка в конце строки? –

Смежные вопросы