Как получить доступ к трем элементам одновременно?
У меня возникла проблема с нарезкой из массива в цикле. То, что я пытаюсь сделать, это перебирать массив и каждый день возвращать 3 разных раздела из массива. Так, например, день один должен вернуть 0,1,2 день 2 должен вернуть 3,4,5 и т. Д... Я использую array_slice()
и он работает для первой итерации, но на последующих итерациях он возвращает только массив с 1 элементом в нем. Любая помощь приветствуется!!
Вот что у меня сейчас есть:
foreach ($days as $day) {
$j = $j + 1;
var_dump("j" . $j);
$activities = array_slice($activities, $j, $number_of_activities);
var_dump("day" . $day);
var_dump($activities);
}
Это то, что возвращается из var_dump...
string(2) "j1"
string(4) "day1"
array(3) {
[0]=> int(1)
[1]=> int(2)
[2]=> int(3)
}
string(2) "j2"
string(4) "day2"
array(1) {
[0]=> int(3)
}
2 ответа
Я думаю, что он делает то, что должен. Ваше переназначение действий на результат среза. Итак, на второй итерации массив состоит из 3 элементов, вы начинаете с индекса два, поэтому у вашего среза есть только один элемент (последний). Я думаю, что у вас есть логическая ошибка. Возможно, вам понадобится временная переменная для хранения фрагмента вместо перезаписи действий.
Я согласен с Крисом, я бы использовал array_chunk()
для этой задачи. Причина в том, что если вы используете array_chunk()
вне вашего цикла, это одноразовый вызов функции, и вы можете получить к нему доступ сколько угодно через индекс чанка. С помощью array_slice()
Внутри вашего цикла будет означать вызов функции на каждой итерации, и это будет менее эффективно, поэтому не является лучшей практикой.
Рассмотрим эти демонстрации:
Демонстрация № 1: больше мероприятий, чем нужно, но без проблем:
$days=[1,2,3];
$activities=['Poker','Blackjack','Omaha','Pinochle','500','Euchre','Canasta','Hearts','Spades','Multitaire'];
$activities_per_day=3;
$activity_sets=array_chunk($activities,$activities_per_day);
foreach($days as $i=>$d){
echo "Day: $d, Activities: ",implode(', ',$activity_sets[$i]),"\n";
}
/*
Day: 1, Activities: Poker, Blackjack, Omaha
Day: 2, Activities: Pinochle, 500, Euchre
Day: 3, Activities: Canasta, Hearts, Spades
*/
Демонстрация № 2: недостаточно мероприятий для заполнения в последний день, но нет проблем:
$days=[1,2,3];
$activities=['Poker','Blackjack','Omaha','Pinochle','500','Euchre','Canasta'];
$activities_per_day=3;
$activity_sets=array_chunk($activities,$activities_per_day);
foreach($days as $i=>$d){
echo "Day: $d, Activities: ",implode(', ',$activity_sets[$i]),"\n";
}
/*
Day: 1, Activities: Poker, Blackjack, Omaha
Day: 2, Activities: Pinochle, 500, Euchre
Day: 3, Activities: Canasta
Демонстрация № 3: последний день не имеет активности - вызывает проблемы:
$days=[1,2,3];
$activities=['Poker','Blackjack','Omaha','Pinochle','500','Euchre'];
$activities_per_day=3;
$activity_sets=array_chunk($activities,$activities_per_day);
foreach($days as $i=>$d){
echo "Day: $d, Activities: ",implode(', ',$activity_sets[$i]),"\n";
}
/*
Day: 1, Activities: Poker, Blackjack, Omaha
Day: 2, Activities: Pinochle, 500, Euchre
Day: 3, Activities: <br />
<b>Notice</b>: Undefined offset: 2 in <b>[...][...]</b> on line <b>33</b><br />
<br />
<b>Warning</b>: implode(): Invalid arguments passed in <b>[...][...]</b> on line <b>33</b><br />
*/