2011-10-29 3 views
3

Вопрос ниже.Получение данных из многоуровневого массива

Это решение, которое я разработал на основе ответа Пикселера.

<?php 
$i = 0; 
foreach ($array as $k1 => $v1) { 
     if (is_array($v1)) { 
      echo $k1."<br />"; 
       foreach ($v1 as $k2 => $v2) { 
        echo "--".$k2."<br />----".$v2."<br />"; 
       } 
      $i++; 
     } 
     echo "<br /<br />"; 
} 
?> 

<?php 
$array = array("Apples" => array("Red" => "$2.95", "Green" => "$2.45"), 
       "Oranges" => array("Navel" => "$4.95"), 
       "Grapes" => array("Purple" => "$3.75", "Green" => "$3.25") 
      ); 
?> 

Можно ли взять то, что выше и получить текст для каждого значения, вызвав ряд? Как я мог бы сделать что-то вроде этого ...

<?php 
echo $array[0]; 
//Outputs "Apples" 

echo $array[0][0]; 
//Outputs "Red" 

echo $array[0][0][0]; 
//Outputs "$2.95" 

echo $array[3][2][1]; 
//Outputs "$3.25" (Grapes > Green > Price) 
?> 

EDIT: Идея заключается в том, что я могу вернуться на первый уровень (яблоки, апельсины, виноград), второй уровень (красный, зеленый, Пупа, Purple, Green) и третьего уровня ($ 2,95, $ 2,45, $ 4,95, $ 3,75, $ 3,25), позвонив по номеру.

Например, я хочу сделать что-то вроде этого:

<?php 

count($array); //returns 3 (Apples, Oranges, Grapes) 

//Do some for/foreach function that will produce the following: 

//Apples 
//->Red: $2.95 
//->Green: $2.45 
//Oranges 
//->Navel: $4.95 
//Grapes 
//Purple: $3.75 
//Green: $3.25 

//I'm hoping to structure the code like this: 

foreach($i = 0; $i =< count($array); $i++){ 
    //echo title of array (Apples) 
    //echo each child key and it's value (Red: $2.95; Green: $2.45) 

    foreach($secondcounter = 0; $secondcounter =< count($array[$i]); $secondcounter++){ 
     echo array_key($array[$i][$secondcounter]) . ": " .$array[$i][$secondcounter]; 
     //Note: I don't actually know if array_key does the trick or not, it's meant to return "Red" in this case, while the non array_key()'d is meant to return the price of red apples, $2.95 
} 

?> 

EDIT: Важно отметить, что я не могу использовать слова, чтобы вызвать данные. Я должен использовать числа, т. Е. [0], чтобы вызвать первый элемент в массиве, потому что яблоки могут меняться в зависимости от того, какую строку данных я загружаю из своей базы данных. Другими словами ... Яблоки могли на самом деле оказаться книгами, а Красный мог оказаться именем книги => цена.

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


Я занимаюсь исследованиями в течение нескольких часов, но я не могу найти что-либо. Очень важно, чтобы я мог вызывать данные по номерам, а не по тексту. Поэтому $ array ["Яблоки"] неприемлем.

Я также посмотрел на json_decode и сериализую/unserialize, и я думаю, что я получаю их основную идею из краткого взгляда ... но я думаю, что моя основная проблема заключается в понимании того, как вызывать приведенные выше данные, представленные в моем пример. Любая помощь будет действительно велика.

+0

Итак, вы хотите использовать массив точно так же, как числовой массив, но вы также хотите знать, что такое пример: 'Grapes -> Purle'? Я бы также рекомендовал использовать 'serialize' и' unserialize', если вы хотите сохранить такой массив в базе данных. – Revenant

+0

Да, я так думаю. Я хочу, чтобы это могло вернуть каждое слово «Яблоки», «Красный» и «2,95 доллара», если это имеет смысл. Но я хочу иметь возможность возвращать все эти значения только с помощью чисел. –

+0

Думаю, вам придется передумать, что вы хотите сделать. Было бы проще просто получить данные из mysql с помощью связанного массива, а также с числовым массивом. У вас будет их обоих, и вы можете делать все, что хотите. Другой способ, вам придется создавать несколько массивов, сравнивать их, пытаться найти номера индексов и т. Д. И т. Д. Вы просто закончите писать кодирование множества строк. – Revenant

ответ

0

Как насчет этого?

array_search("Apples",array_keys($array)); 

Если вы хотите, чтобы петли вашего массива, так или иначе, возможно, придется создать новый массив, цикл через старый массив и создать новый числовой массив массива?

ПЕРВЫЙ ПУТЬ


$array = array("Apples" => array("Red" => "$2.95", "Green" => "$2.45"), 
       "Oranges" => array("Navel" => "$4.95"), 
       "Grapes" => array("Purple" => "$3.75", "Green" => "$3.25") 
      ); 

$newArray = array(); 
foreach ($array as $value) { 
    $newArray[] = (is_array($value)) ? array_values($value) : $value; 
} 

echo '<pre>'; 
var_dump($newArray); 
echo '</pre>'; 

ВТОРОЙ ПУТЬ


$array = array("Apples" => array("Red" => "$2.95", "Green" => "$2.45"), 
       "Oranges" => array("Navel" => "$4.95"), 
       "Grapes" => array("Purple" => "$3.75", "Green" => "$3.25") 
      ); 

$newArray = array(); 
$i = 0; 
foreach ($array as $key => $value) { 
if (is_array($value)) { 
    $newArray[$i] = array(); 
    foreach ($value as $k => $v) { 
    $newArray[$i][] = $v; 
    } 
    $i++; 
} 
} 

echo '<pre>'; 
var_dump($newArray); 
echo '</pre>'; 

echo $newArray[0][0]; 

Очевидно, что я буду рекомендовать первый путь.

+0

Это было бы прекрасно, но яблоки могли бы измениться на несколько разных вещей. Вот почему мне нужно, чтобы он вызывался по номеру. –

+0

Я обновляю свой вопрос, чтобы уточнить. Сожалею. –

+0

Подождите .. Я читаю ваше обновление. Я собираюсь проверить это :) –

1

Это решение, на которое я пришел, основываясь на ответе @ Pixeler.

<?php 
$i = 0; 
foreach ($array as $k1 => $v1) { 
     if (is_array($v1)) { 
      echo $k1."<br />"; 
       foreach ($v1 as $k2 => $v2) { 
        echo "--".$k2."<br />----".$v2."<br />"; 
       } 
      $i++; 
     } 
     echo "<br /<br />"; 
} 
?> 
Смежные вопросы