我试图解决它,但我迷路了。你能看出我的错误吗?
我有问题:
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]);
}
}
}
答案 0 :(得分:1)
当您使用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
。