PHP многомерный массив - заставить его работать

0

То, что я пытаюсь сделать, я не знаю правильного имени, поэтому извиняюсь, если я использовал неправильную терминологию.

Вот основной пример того, чего я пытаюсь достичь:

$arrayData = (4,5,6,7,8,9,10);

$public function setArray($colNum){
    $i = 0;
    while($i < count($arrayData){

Здесь я не знаю, что делать. Я хочу, чтобы $ colNum устанавливал количество столбцов в новом массиве. так

if $colNum = 4, then $arrayNew[$i][$i][$i][$arrayData[$i]

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

Здесь приведен рабочий пример таблицы с четырьмя столбцами (код еще не оптимизирован)

public function parseTable($tableHeader,$isMoney,$colNum) {
    $tableData = $this->myArray;
    $count = 0;
    $placeHolder = 0;

    while($count < count($tableData)){

        // This hides the column headers
        if($count > $colNum - 1) {
            $col1Array[$placeHolder] = $tableData[$count];
            $col2Array[$placeHolder] = $tableData[$count + 1];
            $col3Array[$placeHolder] = $tableData[$count + 2];
            $col4Array[$placeHolder] = $tableData[$count + 3];
            $placeHolder ++;
        }

        $count = $count + $colNum;

    }

    // Remove the empty lines from the array
    $col1Array = array_values(array_filter($col1Array));
    $col2Array = array_values(array_filter($col2Array));
    $col3Array = array_values(array_filter($col3Array));
    $col4Array = array_values(array_filter($col4Array));

    // Put the 0 back in the array
    $col1Array = array_values(str_replace('~',0,$col1Array));
    $col2Array = array_values(str_replace('~',0,$col2Array));
    $col3Array = array_values(str_replace('~',0,$col3Array));
    $col4Array = array_values(str_replace('~',0,$col4Array));

    $count = 0;
    $tableHTML = "<table class=\"table table-striped table-hover\"  data-toggle=\"table\"
           data-search=\"true\"
           data-show-columns=\"true\"
           data-pagination=\"true\"
        >
        <thead>
            <tr>
                <th>$tableHeader[0]</th>
                <th>$tableHeader[1]</th>
                <th>$tableHeader[2]</th>
                <th>$tableHeader[3]</th>
            </tr>
        </thead>
        <tbody>";

    while($count < count($col1Array)){
        // Replaces empty values with the text set when calling the function
        if($col1Array[$count] == ""){
            $col1Array[$count] = $emptyResult;
        }
        if($col2Array[$count] == ""){
            $col2Array[$count] = $emptyResult2;
        }
        if($col3Array[$count] == ""){
            $col3Array[$count] = $emptyResult3;
        }
        if($col4Array[$count] == ""){
            $col4Array[$count] = $emptyResult4;
        }

        // Converts data into money if specified in the function
        if($isMoney[0] == "Currency"){
            if($col1Array != '0'){$colOne =  money_format('%.2n', $col1Array[$count]);}
            else{$col1Array = "$0.00";}
        }else{$colOne = str_replace('0.00','0',$col1Array[$count]);}
        if($isMoney[1] == "Currency"){
            if($col2Array != '0'){$colTwo =  money_format('%.2n', $col2Array[$count]);}
            else{$colTwo = "$0.00";}
        }else{$colTwo = str_replace('0.00','0',$col2Array[$count]);}
        if($isMoney[2] == "Currency"){
            if($col3Array != '0'){$colThree =  money_format('%.2n', $col3Array[$count]);}
            else{$colThree = "$0.00";}
        }else{$colThree = str_replace('0.00','0',$col3Array[$count]);}
        if($isMoney[3] == "Currency"){
            if($col4Array != '0'){$colFour =  money_format('%.2n', $col4Array[$count]);}
            else{$colFour = "$0.00";}
        }else{$colFour = str_replace('0.00','0',$col4Array[$count]);}

        $tableHTML = $tableHTML . "
        <tr>
            <td>$colOne</td>
            <td>$colTwo</td>
            <td>$colThree</td>
            <td>$colFour</td>
        </tr>";
        $count++;
    }

    $tableHTML = $tableHTML . "
        </tbody>
    </table>";

    $this->tableHTML = $tableHTML;
    $this->col1Array = $col1Array;
    $this->col2Array = $col2Array;
    $this->col3Array = $col3Array;
    $this->col4Array = $col4Array;
    $this->totalRows = count($this->col1Array);
}
  • 1
    пробовал рекурсивную функцию, которая добавляет массив к себе потомку для n раз? после этого добавление ваших данных
  • 0
    Я даже не думал об использовании рекурсивной функции, но это с помощью array_push - отличное решение моей проблемы.
Показать ещё 2 комментария
Теги:
multidimensional-array
function

3 ответа

2
Лучший ответ

Вот решение с array_push:

$arrayData = array(4,5,6,7,8,9,10);
$setArray = function($colNum) use($arrayData) {
    $new_array = array();
    for ($i = 0; $i < $colNum; $i++){
        $old_array = array();
        array_push($new_array, $old_array);
    }
    array_push($new_array, $arrayData);
    return $new_array;
};

$new_array = $setArray(5);

echo '<pre>';
die(var_dump($new_array));
  • 0
    Я дам +1 для function ... use , не знал об этом, спасибо!
  • 0
    Это прекрасно работает! Сделал пару модификаций для моего использования. Смотрите мой ответ ниже для того, что я изменил.
Показать ещё 1 комментарий
1

Спасибо всем за вашу помощь! У меня есть много кода, над которым я работаю, и старался сделать его как можно меньше, чтобы получить тот вопрос, который у меня был. Я знаю, что это может сбивать с толку, но я не хотел публиковать все, поскольку я знал, что это небольшая проблема, которая с легким исправлением. Я искал эффективный способ хранения переменной массива в массиве. Моим непосредственным решением было создание функций для каждого количества массивов, которые будут сохранены. Но я хотел, чтобы сделать это там, где 1 функция может хранить столько массивов в массиве динамически. Вот решение благодаря @Sofiane Sadi для кода.

$arrayData = array(array(7,8,9),array(5,6,7),array(8,9,10));
$setArray = function($colNum) use($arrayData) {
$new_array = array();
for ($i = 0; $i < $colNum; $i++){
    $old_array = array();
}
array_push($new_array, $arrayData);
return $new_array;
};

$new_array = $setArray(2);

echo '<pre>';
die(var_dump($new_array));
1

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

Для примера:

$array = array();

create_multi_array($array, 10);

function create_multi_array(&$array, $dim){
    if($dim==0)
        return;
    create_multi_array($array[0], $dim-1);
}
echo "<pre>";
var_dump($array);

выходы:

array(1) {
  [0]=>
  array(1) {
    [0]=>
    array(1) {
      [0]=>
      array(1) {
        [0]=>
        array(1) {
          [0]=>
          array(1) {
            [0]=>
            array(1) {
              [0]=>
              array(1) {
                [0]=>
                array(1) {
                  [0]=>
                  array(1) {
                    [0]=>
                    NULL
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
  • 0
    Я читаю таблицы HTML и преобразовываю столбцы в формат CSV. Затем я взрываю их в массивы. Все это заканчивается в базе данных после того, как я закончу с этим. Проблема в том, что я должен создать другую функцию в зависимости от количества столбцов. Рекурсивная функция, использующая array_push (), должна добиться цели, хотя и с тем, чего я пытаюсь достичь. Спасибо за Ваш ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню