Mảng truy cập được trả về bởi một hàm trong php


88

Tôi đang sử dụng công cụ mẫu chèn mã vào trang web của mình ở nơi tôi muốn.

Tôi đã viết một hàm để kiểm tra một cái gì đó khá dễ dàng:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

Vấn đề là, dữ liệu $ this-> là riêng tư và tôi không thể truy cập nó ở mọi nơi, vì vậy tôi phải sử dụng getData (); mà gây ra vấn đề của tôi.

$this->getData()['a']['b']

không hoạt động và việc gán giá trị trước cũng không vì nó sẽ được sử dụng trực tiếp trong khối if ().

Bất kỳ ý tưởng?


Chỉ định giá trị trả về chắc chắn hoạt động và là cách duy nhất. Bạn có thể cho chúng tôi xem mã không hoạt động của bạn không?
Anti Veeranna 22/09/09

Nó không hoạt động vì mã sẽ được chèn vào mã if (/ * ở đây * /). Vì vậy, tôi không thể chỉ định dữ liệu trước đó.
enyo 22/09/09

1
Bạn đang xây cái quái gì vậy? :) cái gì đó với eval?
Anti Veeranna 22/09/09

Bạn đang cố gắng kiểm tra cái gì? Bạn thử xem phần tử mảng có tồn tại và có giá trị khác không? Bạn có thể sử dụng chức năng 'trống' cho việc này. Câu hỏi này cần rõ ràng hơn!
txwikinger 22/09/09

Giá trị chuỗi mà bạn trả về được myfunction()xử lý thêm như thế nào? Phần đó bị thiếu trong câu hỏi của bạn.
hakre

Câu trả lời:


134

Vì PHP 5.4 nên có thể thực hiện chính xác điều đó:

getSomeArray()[2]

Tham khảo: https://secure.php.net/manual/en/language.types.array.php#example-62

Trên PHP 5.3 trở xuống, bạn cần sử dụng một biến tạm thời.


4
Tôi đã có PHP 5.4.11-1~precise+1và tính năng này không hoạt động! Đã nhận được tin nhắn phản hồiParse error: syntax error, unexpected '['
Eugene

1
+ Eugene bạn đã làm cho nó hoạt động? Có thể những người khác gặp vấn đề tương tự.
enyo

2
Phải mất đến php 5.4 để hỗ trợ ký hiệu mảng được trả về từ các hàm ?! Thật là một lỗi khó chịu.
Basil Musa

Và sau đó bạn cố gắng để có được những yếu tố đầu tiên của một mảng được tạo ra bởi array_filter và bắt đầu khóc
Loupax

17

Bạn không thể sử dụng một cái gì đó như thế này:

$this->getData()['a']['b']

tức là, cú pháp truy cập mảng không thể thực hiện trực tiếp trên một lệnh gọi hàm.

Youy phải sử dụng một số biến tạm thời , như sau:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

Trong trường hợp của bạn, điều này có thể có nghĩa là sử dụng một cái gì đó như sau:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Bạn phải :

  • trước tiên, hãy gọi getData()phương thức của bạn và lưu trữ giá trị trả về của nó trong một biến thể tạm thời
  • sau đó, sử dụng biến tạm thời đó cho thử nghiệm của bạn

Bạn không có nhiều lựa chọn về điều đó, thực sự ...


Vâng, như tôi đã nói, vấn đề của tôi là mã này được chèn vào, trực tiếp trong if (/ * mã ở đây * /) vì vậy việc xác định một hàm ở đó là không thực sự khả thi ...
enyo 22/09/09

Bạn có thể không gán kết quả của lệnh gọi phương thức cho một biến trước câu lệnh if và sử dụng biến đó trong câu lệnh if, thay vì trực tiếp cố gắng gọi phương thức từ câu lệnh if?
Pascal MARTIN 22/09/09

1
Rất tiếc là không ... Đây là một công cụ tạo khuôn mẫu, và tôi không kiểm soát được nó.
enyo 22/09/09

12

Ok ... rõ ràng là không có cách nào tốt hơn, vì vậy tôi sẽ tự trả lời bằng một giải pháp không mấy đẹp đẽ:

Tôi đã tạo hàm:

arrayGet($array, $index) { return $array[$index]; }

Và sử dụng nó như thế này:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

Điều này không đẹp nhưng hoạt động.


1

$this->dataluôn tiếp cận được, nếu nó được bảo vệ. không thể truy cập từ mọi nơi, vì vậy nếu bạn đang quay lại mã của mình và nó được đánh giá như vậy, thì nó sẽ ổn.$object->data$this

Btw, có một lỗi trong mã của bạn: Các dấu ngoặc kép cần được thoát ra.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }

Vâng, xin lỗi ... Tôi đã sửa bài đăng của mình: $ this-> tất nhiên dữ liệu là riêng tư. Cũng đã sửa lỗi đánh máy của tôi khi tạo lỗi.
enyo 22/09/09

1

Nó có thể từ phiên bản PHP 5.4.

Nếu bạn không muốn một biến tạm thời cho điều đó và phiên bản PHP của bạn nhỏ hơn 5.4 , bạn vẫn có thể sử dụng một vài hàm tích hợp sẵn để lấy phần tử đầu tiên hoặc cuối cùng:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Chỉnh sửa: !!! Xin lưu ý rằng trong các phiên bản sau (5.4+) PHP sẽ đưa ra một thông báo, vì end chỉ mong đợi các biến dưới dạng tham số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.