2013-02-04 3 views
0

Уже поздно, и я не могу понять шаблон для проблемы ниже (что было упрощено). Проблема связана с функцией процесса.Проблемный оператор modulo в preg_replace_callback

<?php 
function imcrement_image_id($template){ 
    return preg_replace_callback('/%image_id%/', 'process', $template); 
} 

function process($match){ 
    static $count = 0; 
    $count++; 
    $output = ''; 
    if($count %2 == 0){ 
     $output = 'image-' . (--$count); 
     $count++; 
    } else { 
    $output = 'image-' . $count; 
    } 
return $output; 
} 
?> 

Приложение функций показано в этом фрагменте. Я пытаюсь заменить image_id дважды на петлю, так что figure id="%image_id" и <a href="%image_id" матч.

<?php for ($i=0; $i <3 ; $i++): ?> 
<?php ob_start(); ?> 
<figure id="%image_id%"> 

      <a href="#%image_id%" > 
       <img src="http://placehold.it/550x209"> 
       <figcaption>Caption</figcaption> 
      </a> 
      <p class="description">Quisque facilisis </p> 
</figure> 
<?php $template .= ob_get_clean(); ?> 
<?php endfor; ?> 
// later... 
echo $template; 

В настоящее время этот код работает, но он производит разметку, как это:

<figure id="image-1"> 
<a href="#image-1"> 
... 
<figure id="image-3"> 
<a href="#image-3"> 
... 
<figure id="image-3"> 
<a href="#image-3"> 

Я хотел бы, чтобы это было image-1 image-1, image-2 image-2, image-3 image-3 и так далее. Указатели всегда оценили!

спасибо.

+0

Знак '%' здесь не является модульным оператором; это просто символ в строке. Строка '% image_id%' используется в качестве заполнителя для замены строки. Это могла быть любая строка; он просто содержит процентные знаки. Никакой модуль не участвует вообще. – SDC

+0

@SDC вы пропустили эту строку: 'if ($ count% 2 == 0)' –

+0

@feb - meh, you'r right. Наверное, я был задан заголовком вопроса о модуле в preg_replace_callback в сочетании с заполнителем в preg_replace_callback и строкой-заполнителем. – SDC

ответ

1

Try:

function process($match){ 
    static $count = 1; 
    $count++; 
    return 'image-' . floor($count/2); 
} 

Логика:

  • $count будет 2,3,4,5,6 ... в return заявлении
  • $count/2 вернет 1, 1.5 , 2, 2,5, 3 ...
  • floor($count/2) вернет 1, 1, 2, 2, 3 ...
+0

Спасибо, и приятное объяснение! – Simon