arrays — функция php возвращает последнюю строку после цикла foreach

Следующая функция возвращает только последнюю строку массива:

function myFunc () {

$sql = mySql();
$stid = oci_parse(getConnect(),$sql);

// runs the query above
oci_execute($stid);

if (oci_execute($stid)) {
while ($row =oci_fetch_array($stid,OCI_ASSOC+OCI_RETURN_NULLS)) {
$out1 = "";
foreach($row as $column =>$entry)
$out1 .= $entry;
$output = $out1;
//var_dump($output); - here I can see all array elements
}
return($output);
}
else return "No Oracle connection";
}

var_dump() показывает все элементы массива, но функция отображает только последнюю строку массива. Это потому что функция возвращается? Нужно ли возвращать массив, чтобы получить все элементы массива? Как я могу получить все элементы массива в одну строку?

0

Решение

Вы переопределяете $output в каждой итерации цикла. Вам нужно сохранить эти значения в массиве (или добавить их в зависимости от того, что вы в конечном итоге хотите):

$output = array();
while ($row = oci_fetch_array($stid,OCI_ASSOC+OCI_RETURN_NULLS)) {
$out1 = "";
foreach($row as $column =>$entry) {
$out1 .= $entry;
}
$output[] = $out1;
}
return($output);

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

5

Другие решения

Я бы использовал один из этих двух, в зависимости от того, как вы хотите отформатировать возвращаемый массив.

function myFunc () {
$sql = mySql();
$stid = oci_parse(getConnect(),$sql);
oci_execute($stid);
$output = array();
if (oci_execute($stid)) {
for( $i = 0; $r = oci_fetch_array( $stid, OCI_ASSOC+OCI_RETURN_NULLS ) ){
$output[$i] = $r;
}
}
return $output;
}

// это помещает весь массив результатов в массив. Который, если результат содержит несколько строк, приведет к множественному результату.

function myFunc () {
$sql = mySql();
$stid = oci_parse(getConnect(),$sql);
oci_execute($stid);
$output = array();
if (oci_execute($stid)) {
while( $row = oci_fetch_array( $stid, OCI_ASSOC+OCI_RETURN_NULLS ) ){
foreach( $row AS $key => $val ){
$output[] = $val;
}
}
}
return $output;
}

// Это поместит каждое значение в качестве объекта массива в массиве $ output

0

Я полностью согласен с Джоном.

Однако он был быстрее меня.

Но вот мой:

function myFunc() {
$sql    = mySql();
$stid   = oci_parse(getConnect(), $sql);

// runs the query above
$result = oci_execute($stid);

if ($result) {
$arr = array();
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
foreach($row as $column => $entry) {
$arr[] = $entry;
}
}
$output = $arr; // you can simply go return($arr) but I've left it like this for debugging if you need
return($output);
} else {
return "No Oracle connection: " . $result;
}
}

Что я сделал, так это добавил $ result функции oci_execute (), чтобы дать вам возможность отладки в случае разрыва соединения. Я также превратил вашу добавленную строку в массив.

Надеюсь, поможет.

0
По вопросам рекламы [email protected]