Делайте заглавными каждую вторую букву

Как сделать заглавной каждую вторую букву в строке? Я знаю, как преобразовать в нижний, верхний или первый и т. д., но не уверен, как это сделать во всех остальных случаях. Чтобы было ясно, я включил примеры. Также это для создания шифра, с которым мы с сыном возимся, я бы никогда не форматировал обычный текст таким образом.

pizza -> PiZzA
party -> PaRtY
popcorn -> PoPcOrN

person Ryan Cooper    schedule 04.05.2011    source источник
comment
+1 за включение примеров и довольно четкое объяснение. :)   -  person alex    schedule 04.05.2011


Ответы (3)


$newStr = '';
foreach(str_split($str) as $index => $char) {
    $newStr .= ($index % 2) ? strtolower($char) : strtoupper($char);
}

CodePad.

person alex    schedule 04.05.2011
comment
Краткое объяснение того, что происходит: он использует встроенное условное выражение (это оператор ?), чтобы проверить, является ли позиция четной или нет. Если он четный, напишите его заглавными буквами, в противном случае убедитесь, что он строчный. Удачи! Хороший ответ. +1 - person RageD; 04.05.2011
comment
Работает отлично, спасибо @Alex и @RageD за объяснение. - person Ryan Cooper; 04.05.2011
comment
@Ryan Не беспокойтесь, просто убедитесь, что храните это для себя и своего сына :) - person alex; 04.05.2011
comment
@Alex Алекс Вы знаете, возможна ли та же концепция с массивом? Я взрываю кавычки, выполняя преобразование заглавных букв, и взрываю их обратно, однако очевидно, что str_split ожидает строку. Извините за пинги, перенос кода на основной вопрос. - person Ryan Cooper; 04.05.2011
comment
@Ryan foreach() - это итератор массива, поэтому просто передайте массив прямо ему. Я преобразовал строку в массив с str_split(), чтобы foreach() не жаловался. - person alex; 04.05.2011
comment
@Alex Алекс Я достаточно новичок в программировании, чтобы понять это, вы видите, где я делаю ошибку в добавленном коде? - person Ryan Cooper; 04.05.2011
comment
@Ryan Просто удалите функцию str_split(), которую вы передаете foreach(), и все будет хорошо. Таким образом, это должно выглядеть как foreach($arr as ...). - person alex; 04.05.2011
comment
@ Алекс, я попробовал это, и хотя ошибок нет, похоже, никаких изменений не происходит ... Есть идеи? - person Ryan Cooper; 04.05.2011
comment
@Ryan Возможно, нужно задать новый вопрос. - person alex; 04.05.2011

Я попробую что-то вроде этого:

$string = join(
    array_map(
        function($s){
            return ucfirst($s);
        },
        str_split($string,2)
    )
);

или, как однострочный:

$string = join(array_map(function($s){return ucfirst($s);}, str_split($string,2)));

Вы можете обобщить функцию, передав в качестве параметра длину чанка, который должен быть написан с заглавной буквы, и позволяя функции выполнять работу. Алгоритм прост:

  • str_split возвращает массив строк нужной длины,
  • функция array_map добавляет преобразование в куски и
  • соединение склеивает строки в результирующую строку.

Последняя функция:

function camelCycles($string, $period) {
  return join(
     array_map(
       function($s){
         return ucfirst($s);
       },
       str_split($string, $period)
     )
  );
}

Он использует только собственные конструкции и поэтому должен быть довольно быстрым.

РЕДАКТИРОВАТЬ:

Функция, которая не использует лямбда-выражение и поэтому подходит для PHP 5.0 и более поздних версий, поскольку str_split была введена в выпуске php5.

function camelCycles($string, $span) {
  return join(array_map('ucfirst', str_split(strtolower($string), $span)));
}
person Eineki    schedule 04.05.2011
comment
+1 за то, что сделал это по-другому. Обратите внимание, что людям нужен ›= PHP 5.3, чтобы это работало. Кроме того, вы можете заменить аргумент '' на join(), и он будет еще короче :) - person alex; 04.05.2011
comment
@alex, ты знаешь, я много работаю с javascript, и лямбда-выражения появляются повсюду, особенно когда они не нужны. Хорошая идея для подсказки присоединиться, я применю ее - person Eineki; 04.05.2011
comment
Этот новый очень сексуален. :) - person alex; 04.05.2011

Я бы разделил его как массив, а затем снова объединил:

function strtoupper_lower($str){
     $temp = explode('',$str);
     $return = '';
     foreach($temp as $i=>$val){
         if($i%1 == 0) $return .= strtolower($val);
         else $return .= strtolower($val);
     } 
     return $return;
}
person Naftali aka Neal    schedule 04.05.2011