PHP — Интервал между итерациями массива

#javascript #php #arrays #csv

#javascript #php #массивы #csv

Вопрос:

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

Когда я собираю данные массива, чтобы перенести их в файл .csv, он печатает группировки массива, подобные этой FinanceWaterlooTheodore2015TreasurerTorontoGary2014 .

Возможно ли отметить точку, где заканчивается цикл массива, чтобы он был более разборчивым и получался более похожим на это FinanceWaterlooTheodore2015 // TreasurerTorontoGary2014?

 $unitLevelInvolvement = $_POST["unitLevelInvolvement"];

$unitInvolvementValue = "";
$i;
foreach($unitLevelInvolvement as $involvement)
{
    $i  ;
    $unitInvolvementValue .= $involvement;
}
echo $unitInvolvementValue;

    <div name="unitLevelInvolvement" id="unitLevelInvolvement">
        <input type="text" class="two-lines-textbox" name="unitLevelInvolvement[]" placeholder="Position/Committee" onBlur="this.placeholder='Position/Committee'" onFocus="this.placeholder=''" onKeyUp="checkPage3()" />
        <input type="text" class="two-lines-textbox" name="unitLevelInvolvement[]" id="oectaUnit_1" placeholder="Unit" onBlur="this.placeholder='Unit'" onFocus="this.placeholder=''" onKeyUp="checkPage3()" />

        <div class="clearFix"></div>

        <input type="text" class="two-lines-textbox" name="unitLevelInvolvement[]" id="unitPresident_1" placeholder="Unit President" onBlur="this.placeholder='Unit President'" onFocus="this.placeholder=''" onKeyUp="checkPage3()" />
        <input type="date" class="two-lines-textbox" name="unitLevelInvolvement[]" id="unitYear_1" onKeyUp="checkPage3()" />
        <input type="button" value=" " onClick="addUnitInvolvement()" />
        </div>
    </div><!-- end of unit-level-involvement div-->
    <input type="submit" value="submit" />
</form><!--endForm-->
  

Комментарии:

1. Не могли бы вы просто сделать: $unitInvolvementValue .= «//$involvement»;

2. Нет, потому что это устроит примерно так финансы // ватерлоо //теодор//2015// казначей, а не то, что мне нужно

3. $unitInvolvementValue .= "//" . $involvement; должно сработать, хотя нет причин присваивать значения новой переменной только для того, чтобы повторить ее. Вы могли бы просто поместить echo $involvement . "//"; в цикл foreach.

4. Я пробовал это, но то, что он делает, это помещает // между каждым значением. Что мне нужно, так это группы значений, чтобы между ними были косые черты, так что (FinanceWaterlooTheodore2015) // (TreasurerTorontoGary2014) Итак, цикл 1 собирает первый набор, ставит разрыв, а затем цикл два соберет второй набор.

5. не лучше ли использовать запятую вместо косой черты в качестве разделителя?

Ответ №1:

Я понимаю, что вы пытаетесь ставить разделитель каждые 4 итерации (потому что у вас есть 4 входных данных).

Обратите внимание, что этот ответ будет работать, только если у вас есть ровно 4 входных данных.

Вы могли бы попробовать что-то вроде этого:

 $unitLevelInvolvement = $_POST["unitLevelInvolvement"];

$unitInvolvementValue = "";
$i = 0;
foreach($unitLevelInvolvement as $involvement)
    {
        $unitInvolvementValue .= $involvement;
        $i  ;
        if($i % 4 == 0){
          $unitInvolvementValue .= "//";
        }
    }
echo $unitInvolvementValue;
  

Комментарии:

1. Если OP (или нечестивый пользователь) добавит / удалит поле, его данные будут повреждены. OP должен создать новый массив для каждой группы в своей форме HTML.

2. @stephenWidom Можете ли вы помочь мне с этим или направить меня на правильный путь

Ответ №2:

Прежде всего, вам нужно создать «группы», поскольку у вас их еще нет. Вы можете сделать это, создав многомерный массив с name атрибутом. Ваш HTML может выглядеть примерно так:

 <div name="unitLevelInvolvement" id="unitLevelInvolvement">
    <input type="text" class="two-lines-textbox" name="unitLevelInvolvement['group1'][]" placeholder="Position/Committee" onBlur="this.placeholder='Position/Committee'" onFocus="this.placeholder=''" onKeyUp="checkPage3()" />
    <input type="text" class="two-lines-textbox" name="unitLevelInvolvement['group1'][]" id="oectaUnit_1" placeholder="Unit" onBlur="this.placeholder='Unit'" onFocus="this.placeholder=''" onKeyUp="checkPage3()" />

    <div class="clearFix"></div>

    <input type="text" class="two-lines-textbox" name="unitLevelInvolvement['group2'][]" id="unitPresident_1" placeholder="Unit President" onBlur="this.placeholder='Unit President'" onFocus="this.placeholder=''" onKeyUp="checkPage3()" />
    <input type="date" class="two-lines-textbox" name="unitLevelInvolvement['group2'][]" id="unitYear_1" onKeyUp="checkPage3()" />
    <input type="button" value=" " onClick="addUnitInvolvement()" />
    </div>
</div><!-- end of unit-level-involvement div-->
  

Затем вы можете выполнить итерацию по массиву следующим образом:

 $unitInvolvementValue = array();
foreach($unitLevelInvolvement as $group)
{
    $groupInvolvement = "";
    foreach($group as $involvement)
    {
        $groupInvolvement .= $involvement;
    }
    $unitInvolvementValue[] = $groupInvolvement;
}

echo implode("//", $unitInvolvementValue );
  

Я использую implode() подход, потому что он добавляет разделитель только между значениями, а не в начале или конце строки.