Как в цикле foreach на php заполнить создать массив, а не объект?

105
16 ноября 2020, 07:30

Подкажите пожалуйста. У меня есть цикл в php

   foreach ($sovteacher->find()->asArray()->all() as $key => $customer) {
            array_push($stack, $customer['fio1'].' '.$customer['fio2'].' '.$customer['fio3']);
        }

Если я использую

array_push($stack, $customer['fio1'].' '.$customer['fio2'].' '.$customer['fio3']);

У меня получается объект следующего вида.

{
[0] => 'value'
[1] => 'value'
[n] => 'value'
}

Как мне изменить метод чтобы получился массив.

[
 '0' => 'value',
 '1' => 'value',
 'n' => 'value',
]
Посмотрел комментарии увидел в чем проблема...
Подробности:
(php) -> lambda
Проблема в том, что я лямбду не могу локально отлаживать. Только если sam aws использовать, но там лямбды по другому пишутся...
В самой лямбде у меня для обработки request стоит следующий код

    module.exports = async (req, res)  => {
            if (req.method === 'POST') {
                let body = '';
                req.on('data', chunk => {
                    body += chunk.toString(); // convert Buffer to string
                });
                req.on('end', () => {

                    res.end(body);
                });
            }
    };

Код в PHP

    public function actionConvert()
        {
            \Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
            $sovteacher = new SovteachParticipant();
            $stack = array();
            $array = array( );
            foreach ($sovteacher->find()->asArray()->all() as $key => $customer) {
                $array[$key] = 'sdfsdfsd';
    //            array_push($stack, $customer['fio1'].' '.$customer['fio2'].' '.$customer['fio3']);
            }
            echo'<pre>';
            var_dump($array);
            $client = new Client();
            $response = $client->createRequest()
                ->setMethod('POST')
                ->setUrl('https://lambda.szababurinv.now.sh')

                ->setData( $array)
                ->send();
            if ($response->isOk) {
                echo'<pre>';
                var_dump($response->content); exit;
            }
            return $this->redirect(['index']);
        }

Посмотрев все комментарии, проверил ответы.
В таком виде ответ приходит правильный
            foreach ($sovteacher->find()->asArray()->all() as $key => $customer) {
                $array[$key] = 'sdfsdfsd';
    //            array_push($stack, $customer['fio1'].' '.$customer['fio2'].' '.$customer['fio3']);
            }

Запрос - Ответ
    array(3) {
      [0]=>
      string(8) "sdfsdfsd"
      [1]=>
      string(8) "sdfsdfsd"
      [2]=>
      string(8) "sdfsdfsd"
    }
    string(32) "0=sdfsdfsd&1=sdfsdfsd&2=sdfsdfsd"

А вот в таком не правильно:
    array(3) {
      [0]=>
      string(12) "Синкин"
      [1]=>
      string(16) "Петухова"
      [2]=>
      string(18) "Нестерова"
    }
    string(146) "0=%D0%A1%D0%B8%D0%BD%D0%BA%D0%B8%D0%BD&1=%D0%9F%D0%B5%D1%82%D1%83%D1%85%D0%BE%D0%B2%D0%B0&2=%D0%9D%D0%B5%D1%81%D1%82%D0%B5%D1%80%D0%BE%D0%B2%D0%B0"

Мне сейчас надо как то к строке правильно переменную привести.
Answer 1

Старайтесь не нагромождать все в кучу, потом ведь самому сложно будет разгребать. Кто му же еще и стыдно станет со временем. Есть же переменные.

$stack = [];
$customer = $sovteacher->find()->asArray()->all();
foreach ($rows as $key => $customer) {
    $stack[] = $customer['fio1'] . ' ' . $customer['fio2'] . ' ' . $customer['fio3']);
}

ТО, это будет массив. Утверждать не буду, но кажется такая штука работает быстрее $stack[] = $customer['fio1'], чем если пушить в массив.

Answer 2
// Объявляем пустой массив, в который будем добавлять элементы.
$stack = [];
// Предварительно получаем исходные данные.
//$customers = $sovteacher->find()->asArray()->all();
$customers = [
    ['fio1' => '1 fio1', 'fio2' => '1 fio2', 'fio3' => '1 fio3', 'year' => '43'],
    ['fio1' => '2 fio1', 'fio2' => '2 fio2', 'fio3' => '2 fio3', 'year' => '33'],
    ['fio1' => '3 fio1', 'fio2' => '3 fio2', 'fio3' => '3 fio3', 'year' => '27']
];
foreach ($customers as $customer) {
    //$stack[] = $customer['fio1'].' '.$customer['fio2'].' '.$customer['fio3'];
    array_push($stack, $customer['fio1'].' '.$customer['fio2'].' '.$customer['fio3']);
}
// Распечатаем тип и содержимое переменной.
dump(gettype($stack));
dump($stack);
// Кодируем в json.
$stack = json_encode($stack);
// Распечатаем тип и содержимое переменной.
dump(gettype($stack));
dump($stack);

UPD

А вот в таком не правильно:

array(3) { [0]=> string(12) "Синкин" [1]=> string(16) "Петухова" [2]=> string(18) "Нестерова" }

Строка array(3) { указывает на то, что это массив с тремя элементами.

Answer 3

Спасибо всем за комментарии и варианты ))

это формат данных был application/x-www-form-urlencoded он на стороне yii2 не правильно декодировался когда русский язык был.

на на стороне node.js вставил преобразование в json

function json (str){
    return new Promise((resolve, reject) => {
        let obj,i,pt,keys,j,ev;
        if (typeof json.br !== 'function')
        {
            json.br = function(repl)
            {
                if (repl.indexOf(']') !== -1)
                {
                    return repl.replace(/\](.+?)(,|$)/g,function($1,$2,$3)
                    {
                        return json.br($2+'}'+$3);
                    });
                }
                return repl;
            };
        }
        str = '{"'+(str.indexOf('%') !== -1 ? decodeURI(str) : str)+'"}';
        obj = str.replace(/\=/g,'":"').replace(/&/g,'","').replace(/\[/g,'":{"');
        obj = JSON.parse(obj.replace(/\](.+?)(,|$)/g,function($1,$2,$3){ return form2Json.br($2+'}'+$3);}));
        pt = ('&'+str).replace(/(\[|\]|\=)/g,'"$1"').replace(/\]"+/g,']').replace(/&([^\[\=]+?)(\[|\=)/g,'"&["$1]$2');
        pt = (pt + '"').replace(/^"&/,'').split('&');
        for (i=0;i<pt.length;i++)
        {
            ev = obj;
            keys = pt[i].match(/(?!:(\["))([^"]+?)(?=("\]))/g);
            for (j=0;j<keys.length;j++)
            {
                if (!ev.hasOwnProperty(keys[j]))
                {
                    if (keys.length > (j + 1))
                    {
                        ev[keys[j]] = {};
                    }
                    else
                    {
                        ev[keys[j]] = pt[i].split('=')[1].replace(/"/g,'');
                        break;
                    }
                }
                ev = ev[keys[j]];
            }
        }
        obj = JSON.stringify(obj)
        resolve(obj)
    })
}

Всё заработало

READ ALSO
получить первую пару ключ=значение в массиве php

получить первую пару ключ=значение в массиве php

Как в php получить первую пару ключ=значение в массиве? Например:

108
Мой пример класс и интерфейс

Мой пример класс и интерфейс

Отделение «описания методов» от их реализацииРаньше я тебе рассказывал, что если ты хочешь разрешить вызывать методы своего класса из других...

145
Как асинхронно скачать файлы? [Android - Java]

Как асинхронно скачать файлы? [Android - Java]

Всем привет! Необходимо скачать файл по имеющейся ссылке и сохранить по указанному путиПуть указать несложно, скачать файл, относительно,...

112