php array_push()期望参数1为数组,给定整数

时间:2016-08-25 15:08:56

标签: php

我试图解决它,但我迷路了。你能看出我的错误吗?

我有问题:

array_push($change_data[$y],$_POST['new']['location'][$y]);

我收到错误:

  

array_push()期望参数1为数组,整数在......

中给出

‍$‍‍y是一个整数,但我需要将它保存在那里。我需要创建数组:

$change_data(id => location = value)

$location_count = count($_POST['new']['id']);           
$change_data=array();  

for($y=0; $y<$location_count;$y++){ 
    if (!empty($_POST['new']['location'])) {
        array_push($change_data,$y);

        if (!empty($_POST['new']['location'][$y])) { 
            array_push($change_data[$y],$_POST['new']['location'][$y]);  
        }
    }
}

2 个答案:

答案 0 :(得分:1)

PHP - array_push

当您使用import MockAdapter from 'axios-mock-adapter'; import axios from 'axios'; import thunk from 'redux-thunk'; import configureMockStore from 'redux-mock-store'; import * as actionTypes from './userConstants'; import * as actions from './userActions'; const mockAxios = new MockAdapter(axios); const mockStore = configureMockStore(middlewares); describe('fetchCurrentUser', () => { afterEach(() => { mockAxios.reset(); }); context('when request succeeds', () => { it('dispatches FETCH_CURRENT_USER_SUCCESS', () => { mockAxios.onGet('/api/v1/user/current').reply(200, {}); const expectedActions = [ { type: actionTypes.SET_IS_FETCHING_CURRENT_USER }, { type: actionTypes.FETCH_CURRENT_USER_SUCCESS, user: {} } ]; const store = mockStore({ users: Map() }); return store.dispatch(actions.fetchCurrentUser()).then(() => expect(store.getActions()).to.eql(expectedActions) ); }); }); 时,它会将新元素放在数组的末尾,您无法决定array_push

因此array key
应为array_push($change_data[$y],$_POST['new']['location'][$y]);

如果你想决定钥匙,你会这样做:
array_push($change_data,$_POST['new']['location'][$y]);

答案 1 :(得分:1)

问题是您要取消引用该值,然后尝试将其用作数组。那不行。因为$change_data[$y]为我们提供了一个标量整数值,但是array_push需要一个数组值,而不是一个标量值(因此你得到的错误)。

更简单的方法是直接分配给数组。 $change_data[] = $y在语义上等同于说array_push($change_data, $y)

另一个问题是$change_data[$y]可能并不总是您认为它在此循环中的位置,因为您有条件地推送到数组并且$y线性递增。您无法使用array_push选择密钥,但可以说$change_data[$y] = $y

最后你的循环循环笨拙,因为它对PHP Arrays做出了一些不正确的假设。即数组键始终是数值,从0开始依次递增。

相反,如果我们更仔细地评估您在此处尝试做什么,您会发现您只是尝试将$_POST['new']['id']$_POST['new']['location']用作adjacency list。遍历PHP数组和可遍历对象的理智方法是使用foreach构造,这可以保证您的for循环在这里,根本不会。

这是一种编写相同代码的简单方法,但不容易出错。

$change_data = [];
foreach(array_filter($_POST['new']['id']) as $key => $value) {
    if (!empty($_POST['new']['location'][$key])) {
        $change_data[$key] = $_POST['new']['location'][$key];
    }
}

这里的区别在于foreach构造保证我们迭代array_filter($_POST['new']['id'])中的每个元素,array_filter()保证该循环中的任何元素都不会被视为empty()。由于密钥由foreach跟踪并存储在$key变量中,因此我们会生成相同的邻接列表假设,并在相同的键值下直接分配给$change_data