2016-10-15 2 views
-1

Я пытаюсь напечатать массив в алфавитном порядке и заглавные буквы первых букв каждой строки. Он говорит, что в foreach() есть недопустимый аргумент.PHP Сортировка String Array

<?php 
$stringsArr = array("zulu", "alpha", "omega"); 
function sortAndTitle($arr){ 
    $newArr = ucfirst(sort($arr)); 
    foreach($newArr as $value){ 
     echo $value . "<br/>"; 
    }; 
}; 
sortAndTitle($stringsArr); 
?> 
+0

Я в замешательстве: почему ваш код делает это с объявлением функции, а затем вызовом функции, где массив даже не передается по ссылке? Почему бы вам просто не сделать это напрямую? '$ mapped = array_map (" ucfirst ", sort ($ stringsArr)))' done. –

+0

@ Mike'Pomax'Kamermans проверяет, что возвращает 'sort()'. Он изменяет массив на месте и возвращает 'bool', поэтому ваш код также не работает. – pid

+0

Так что просто соберите на месте, затем массив_мапа, как ответ Джибина Мэтью. –

ответ

1

Существует не менее двух ошибок.

Функция sort() не возвращает array, а просто bool.

Функция ucfirst() не принимает array, но только string.

Попробуйте вместо этого:

<?php 

function sortAndTitle($arr) { 
    sort($arr); 
    return array_map('ucfirst', $arr); 
} 

print_r(sortAndTitle([ "alhpa", "beta", "gamma" ]); 

Это не использовать, чтобы проверить результат sort(), если вы знаете, что $arr является массивом. Он будет терпеть неудачу, если он не является массивом, поэтому не беспокойтесь об этом слишком много. Окончательный ?> может (и должен!) Быть опущен. Это более безопасный способ написания кода для определенных фреймворков, таких как Symfony.

Кроме того, не печатайте внутри функции sortAndTtitle(). Как говорится в названии, только сортировать и название (заглавные буквы).

Последняя строка предназначена только для вашего тестирования.

2
if(sort($stringsArr)){ 
    print_r(array_map('ucfirst', $stringsArr)); 
}else{ 
    echo "sort failed"; 
} 

Так что для вас случае это будет выглядеть

<?php  
function sortAndTitle($arr){ 
    if(sort($arr)){ 
     print_r(array_map('ucfirst', $arr)); 
    }else{ 
     echo "sort failed"; 
    } 
} 
$stringsArr = array("zulu", "alpha", "omega"); 
sortAndTitle($stringsArr); 
?> 
3

sort() не принимает строку, ucfirst() не принимает массив. Нет необходимости хранить сортировку ($ arr) в переменной, потому что она сортируется внутри. Естественно также добавлять тип флага в сортировку. Для Попробуйте это:

<?php 
$stringsArr = array("zulu", "alpha", "omega"); 

function sortAndTitle($arr){ 
    sort($arr, SORT_NATURAL); 
    foreach($arr as $value){ 
     echo ucfirst($value). "<br/>"; 
    } 
} 
sortAndTitle($stringsArr); 
?> 

Примечание: Все параметры в функции PHP передаются в качестве значений. Если вы хотите изменить свой массив (или любой параметр, переданный в функцию), не забудьте объявить функцию с параметром массива с префиксом амперсанда (&). Поэтому в вашем случае sortAndTitle (& $ stringsArr).

+0

Спасибо, что это самое быстрое исправление для моего кода. Теперь я буду изучать параметры sort(). –

+0

@Nathan Wonz, Если этот ответ полезен, вы можете щелкнуть значок галочки, чтобы принять его. –

0

Благодарим вас за понимание проблемы. Я узнал кое-что из всех ответов. Одна вещь, о которой я не понимал, заключалась в том, что мне нужно было постоянно менять значения массива на первое письмо UpperCase. Вот код, с которым мне удалось это сделать. Если есть более быстрый способ, прокомментируйте.

$stringsArr = array("zulu", "alpha", "omega"); 
function sortAndTitle($arr){ 
    sort($arr); 
    for($x = 0; $x < count($arr); $x++){ 
     $arr[$x] = ucfirst($arr[$x]); 
    }; 
    return implode(", ", $arr); 
}; 
echo sortAndTitle($stringsArr);