2009-01-11 29 views
16

Tôi đã có một mảng kết hợp đa chiều trong đó bao gồm một yếu tố nhưChuyển đổi một String để Variable

$data["status"] 
$data["response"]["url"] 
$data["entry"]["0"]["text"] 

Tôi đã có một chuỗi như:

$string = 'data["status"]'; 
$string = 'data["response"]["url"]'; 
$string = 'data["entry"]["0"]["text"]'; 

Làm thế nào tôi có thể chuyển đổi các dây vào một biến để truy cập vào phần tử mảng thích hợp? Phương thức này sẽ cần phải làm việc trên bất kỳ mảng nào ở bất kỳ kích thước nào.

Trả lời

14

Nhanh chóng và bẩn:

echo eval('return $'. $string . ';'); 

Tất nhiên chuỗi đầu vào sẽ cần phải được được làm vệ sinh đầu tiên.

Nếu bạn không thích nhanh chóng và bẩn ... sau đó điều này sẽ làm việc quá và nó không yêu cầu eval mà làm cho ngay cả tôi cringe.

Nó hiện, tuy nhiên, làm cho các giả định về định dạng chuỗi:

<?php 
$data['response'] = array(
    'url' => 'http://www.testing.com' 
); 

function extract_data($string) { 
    global $data; 

    $found_matches = preg_match_all('/\[\"([a-z]+)\"\]/', $string, $matches); 
    if (!$found_matches) { 
      return null; 
    } 

    $current_data = $data; 
    foreach ($matches[1] as $name) { 
      if (key_exists($name, $current_data)) { 
        $current_data = $current_data[$name]; 
      } else { 
        return null; 
      } 
    } 

    return $current_data; 
} 

echo extract_data('data["response"]["url"]'); 
?> 
+0

Điều gì là một thay thế dài dòng Điều gì về đề xuất một định dạng chuỗi tốt hơn, hữu ích hơn? –

+6

Bởi vì điều đó sẽ không trả lời câu hỏi. 01 –

-1

Bạn sẽ truy cập chúng thích:

print $$string; 
+0

-1 này không hoạt động. – Triptych

+0

Bạn nói đúng, nó không hoạt động với các mảng. Nên đã thử nghiệm – MattBelanger

47

PHP variable variables sẽ giúp bạn ra khỏi đây. Bạn có thể sử dụng chúng bằng cách đặt trước biến với một ký hiệu đô la:

$foo = "Hello, world!"; 
$bar = "foo"; 
echo $$bar; // outputs "Hello, world!" 
+0

Tôi không biết rằng điều này đã làm việc với các mảng lồng nhau –

+0

Điều này giải quyết được vấn đề cho tôi; – Greg

+0

@Greg: Nó có lẽ chỉ che giấu vấn đề và làm cho nó tồi tệ hơn: P –

0

Các mặt hàng này trên Variable variables page:

function VariableArray($data, $string) { 
    preg_match_all('/\[([^\]]*)\]/', $string, $arr_matches, PREG_PATTERN_ORDER); 

    $return = $arr; 
    foreach($arr_matches[1] as $dimension) { $return = $return[$dimension]; } 

    return $return; 
} 
+0

Khá chắc chắn điều này sẽ không hoạt động với dấu ngoặc kép xung quanh tên trường và nếu chuỗi $ không hợp lệ ... tôi chắc chắn nó sẽ bị lỗi. –

+0

Đúng, kiểm tra nhanh của tôi cho thấy bạn cần sử dụng một cái gì đó như: [mục] [0] [văn bản] – Gilean

0

Tôi đã đấu tranh với điều đó là tốt, Tôi có điều này:

$user = array('a'=>'alber', 'b'=>'brad'...); 

$array_name = 'user'; 

và tôi đã tự hỏi làm thế nào để có được thành albert.

lúc đầu tôi đã cố gắng

$value_for_a = $$array_name['a']; // this dosen't work 

sau đó

eval('return $'.$array_name['a'].';'); // this dosen't work, maybe the hoster block eval which is very common 

rồi cuối cùng tôi đã cố gắng điều ngu ngốc:

$array_temp=$$array_name; 
$value_for_a = $array_temp['a']; 

và điều này chỉ làm việc hoàn hảo! sự khôn ngoan, làm điều đó đơn giản làm điều đó ngu ngốc.

Tôi hy vọng điều này sẽ trả lời câu hỏi của bạn

5

Điều này có thể được thực hiện theo cách đơn giản hơn nhiều. Tất cả những gì bạn phải làm là suy nghĩ về chức năng mà PHP cung cấp để tạo ra các biến.

$string = 'myvariable'; 
extract(array($string => $string)); 
echo $myvariable; 

hoàn tất!

0

Bạn có thể chuyển bằng tham chiếu với toán tử &.Vì vậy, trong ví dụ của bạn, bạn sẽ có một cái gì đó như thế này

$string = &$data["status"]; 
$string = &$data["response"]["url"]; 
$string = &$data["entry"]["0"]["text"]; 

Nếu không, bạn cần phải làm điều gì đó như thế này:

$titular = array(); 
for ($r = 1; $r < $rooms + 1; $r ++) 
{ 
    $title = "titular_title_$r"; 
    $firstName = "titular_firstName_$r"; 
    $lastName = "titular_lastName_$r"; 
    $phone = "titular_phone_$r"; 
    $email = "titular_email_$r"; 
    $bedType = "bedType_$r"; 
    $smoker = "smoker_$r"; 

    $titular[] = array(
     "title" => $$title, 
     "first_name" => $$firstName, 
     "last_name" => $$lastName, 
     "phone" => $$phone, 
     "email" => $$email, 
     "bedType" => $$bedType, 
     "smoker" => $$smoker 
    ); 
} 
Các vấn đề liên quan