Задать вопрос
@DangerPro
Новичок в web-программировании

Как правильно прогнать массив через цикл foreach()?

Здравствуйте. Помогите пожалуйста с кодом, а то я в этом не силен.
Я сделал выборку из базы и получил массив.
$nameBook = Book::find()->select('id,name')->asArray()->all();

Мне нужно чтобы каждая полученная запись из поля NAME была обреза по первую букву, у меня на это есть функция:
function getFirstLetter($str) {
      return mb_substr($str, 0, 1, 'utf-8');
}

Все выше упомянутое выполняется в :
public function actionAbc() {
      //здесь код
}

И у меня проблема как все это грамотно сделать, в том числе и прогнать массив через цикл, что бы можно было передавать данные в getFirstLetter(). За ранее большое спасибо))
  • Вопрос задан
  • 494 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
asArray() - убрать, так как получите массив, в то время, как Вам нужен объект модели, что бы работал Ваш метод getFirstLetter, его надо разместить в моделе и сделать публичным, как-то так:
public function getFirstLetter() {
      return mb_substr($this->name, 0, 1, 'utf-8');
}

далее где необходимо:
foreach(Book::find()->select('id,name')->all() as $one){
echo $one->firstLetter;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Tem_ka
public function actionAbc() {
    $nameBook = Book::find()->select('id,name')->asArray()->all();
    foreach ($nameBook as &$book) {
        $book['name'] = getFirstLetter($book['name']);
    }
    return $nameBook;
}
Ответ написан
Комментировать
$nameBook = Book::find()->select(['id', 'name' => 'LEFT(name, 1)'])->asArray()->all();


или

$nameBook = ArrayHelper::getColumn($nameBook, function($row){
    getFirstLetter($row['name']);
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы