PHP Как выбрать массив по имени в зависимости от другого значения массива и назначить содержимое переменным? - PullRequest
1 голос
/ 21 апреля 2020

Отказ от ответственности: я новичок в PHP, поэтому, пожалуйста, будьте терпеливы. Я потратил целый день, пытаясь понять это, но я чувствую, что не знаю правильных методов или пытаюсь ошибиться.


Чего я хочу достичь

Я позволяю пользователю выбирать до трех элементов из поля ввода с множественным выбором в форме. Я хочу напечатать всю информацию о тех элементах, которые хранятся в отдельных массивах, в формате PDF. Поле ввода содержит около 10 различных опций (скажем, от A1 до A10), и я извлекаю их в массив после отправки формы:

$itemList = [
  [0] => A1,
  [1] => A2,   // optional
  [2] => A3    // optional
]

Теперь у меня есть отдельный массив для каждого элемента, содержащий дополнительную информацию (которая может поступить из базы данных позже):

$infoA1 = [
  "info1" = "lorem",
  "info2" = "ipsum",
  "info3" = "dolor"
]

$infoA2 = [
  "info1" = "sit",
  "info2" = "amet",
  "info3" = "tatem"
]

$infoA3 ...

Все информационные значения должны быть назначены переменным для размещения в файле PDF, поэтому мне нужно проверить, сколько элементов было выбрано в общей сложности и для каждого выбранного элемента Мне нужно вызвать такую ​​функцию:

function items1() {
  $pdf->SetXY(188.5,24);                 // *Note

  $pdf->Cell(17,4.7, $info1 ,0,2,'');    // $infoA1[0] = $info1
  $pdf->Cell(17,4.7, $info2 ,0,2,'');    // $infoA1[1] = $info1
  $pdf->Cell(17,4.7, $info3 ,0,2,'');    // $infoA1[2] = $info1
}

* Примечание: у меня не может быть одной функции для всех элементов, поскольку информационные переменные для каждого выбранного элемента должны go различные координаты X и Y на pdf.

...

Вот мой главный вопрос:

Как я могу проверить, какие элементы находятся в отправленный массив $itemList И выбор $info array с тем же именем, чтобы получить info values, назначенный для переменных-заполнителей, которые заполняют pdf?

Я думал, что я могу как-то сравнить тогда ames, например, получить info array, имя которого содержит то же значение, что и отправленный элемент (например, «A1» в «$ infoA1»). Но пока не повезло.

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

Ответы [ 4 ]

0 голосов
/ 23 апреля 2020

Итак, я наконец-то понял это благодаря комбинации решений @Mik и @kmoser, большое спасибо вам обоим!

// multilevel $info array holding data

$info = [
  'A1' => [
    "info1" => "lorem",
    "info2" => "ipsum",
    "info3" => "dolor",
  ],
  'A2' => [
    "info1" => "sit",
    "info2" => "amet",
    "info3" => "tatem",
  ],
  'A3' => [
    ...
];


// array of selected items submitted by form

$itemList = ["A1", "A2", "A3"];    // could also be ["A4", "A8", "A7"]


// map items to $info and coordinates

$map = [
  $itemList[0] => [ $info[$itemList[0]], 188.5, 24 ],
  $itemList[1] => [ $info[$itemList[1]], 188.5, 95.2 ],
  $itemList[2] => [ $info[$itemList[2]], 188.5, 167.7 ]
];


// call function for each submitted item
// also includes $pdf for use in function

foreach ($itemList as $item) {
  items($map[$item], $pdf);
}


// function gets mapped array and places data to X any Y coords

function items($item, $pdf) {
  $data = $item[0];
  $x = $item[1];
  $y = $item[2];

  $pdf->SetXY($x, $y);

  foreach ($data as $v) {
      $pdf->Cell(17,4.7, $v ,0,2,'');
  }
}


// this places the desired data to the pdf
// "lorem, ipsum, dolor" to (188.5/24), "sit, amet, tatem" to (188.5/95.2), and so on...

Что ж, теперь это полное решение, но я не не хочется брать на себя ответственность, так как этого не будет без твоих ответов. Итак, что здесь делать честно?

Также, если здесь есть что улучшить, пожалуйста, дайте мне знать.

0 голосов
/ 21 апреля 2020

Вы писали:

Примечание. У меня не может быть одной функции для всех элементов, поскольку информационные переменные для каждого выбранного элемента должны go находиться в разных местах X и Y на pdf

На самом деле может (и, вероятно, должен) иметь одну такую ​​функцию, которая принимает три параметра: массив данных, координату x и координату y. Я решил передать их как один массив, но вы можете изменить это.

function items($a) {
    $data = $a[0];
    $x = $a[1];
    $y = $a[2];

    $pdf->SetXY($x, $y);

    foreach ( $data as $v ) {
        $pdf->Cell(17,4.7, $v ,0,2,'');
    }
}

(В вашем коде вы, казалось, размещали все в одном месте: $pdf->Cell(17,4.7, $info1 ,0,2,''). Я сохранил его таким образом, но это только кажется неправильным.)

Тогда вам нужен способ сопоставления того, что находится в $itemList с $infoA1 переменными:

$map = [
    'A1' => [ $infoA1, 188.5, 24 ]
    'A2' => [ $infoA2, 355, 30 ], // Just making it up
    'A3' => [ $infoA3, 500, 50 ], // Just making it up
];

Наконец, выполните $itemList и найдите соответствующую информацию в $map и передайте ее функции items():

foreach ( $itemList as $v ) {
    if ( $map[ $v ] ) {
        items( $map[ $v ] );
    }
}

Это можно упростить и / или переписать несколькими способами, но все зависит от того, что имеет для вас смысл и как ваши данные структурированы.

0 голосов
/ 21 апреля 2020

* Примечание. У меня не может быть одной функции для всех элементов, поскольку информационные переменные для каждого выбранного элемента должны go находиться в разных местах X и Y в файле PDF.

Полагаю, вы можете передать X и Y в качестве аргументов

Я рекомендую преобразовать ваши переменные в многомерный массив:

$itemList = [
  [0] => 'A1',
  [1] => 'A2',   // optional
  [2] => 'A3',    // optional
];

$info = [
'A1' => [
  'x' => 188.5, 
  'y' => 24,
  "info1" => "lorem",
  "info2" => "ipsum",
  "info3" => "dolor",
],

'A2' = [
  'x' => 188.6, 
  'y' => 25,
  "info1" => "sit",
  "info2" => "amet",
  "info3" => "tatem",
],

'A3' ...
];

и мы можем переписать функцию:

function items($pdf, $info) {
  $pdf->SetXY($info['x'], $info['y']);

  $pdf->Cell(17,4.7, $info['info1'] ,0,2,'');
  $pdf->Cell(17,4.7, $info['info2'] ,0,2,'');
  $pdf->Cell(17,4.7, $info['info3'] ,0,2,'');
}

, чтобы использовать его, как показано ниже:

foreach ($itemList as $item) {
  items($pdf, $info[$item]);
}

, поэтому вам не нужно проверять $itemList.

0 голосов
/ 21 апреля 2020

Вы можете использовать переменные переменные. https://www.php.net/manual/en/language.variables.variable.php

extract(${'info'.$itemList[0]});
var_dump($info1);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...