我基本上是在将对象发送到视图之前进行格式化(在foreach()
上使用$submissions
。我遇到的问题是parse_url()只接受一个索引不是整个数组对象。
我的SubmissionsController中有这个方法:
public function newest() {
$submissions = $this->Submission->find('all', array(
'conditions' => array('Submission.approved' => '1'),
'order' => 'Submission.created DESC'
));
$this->set('submissions', $submissions);
$this->set('sourceShortUrl', AppController::shortSource($submissions));
}
在我的AppController中,我有这个方法返回格式化的URL:
protected function shortSource($source) {
return $sourceShortUrl = str_ireplace('www.', '', parse_url($source, PHP_URL_HOST));
}
这适用于单个条目,但是parse_url不能接受数组,所以在控制器中有一种方法可以发送对象的索引吗?例如。在我在视图中循环它之前,$ submissions ['Submission'] ['source']?
我的替代方法是在我的shortSource($source)
方法中执行类似的操作:
if (is_array($source)) {
for ($i = 0; $i < count($source); $i++) {
return $sourceShortUrl = str_ireplace('www.', '', parse_url($source[$i]['Submission']['source'], PHP_URL_HOST));
}
}
但那只是回归第一个(显然)。这样做的最佳方式是什么?
答案 0 :(得分:1)
你走在正确的轨道上。检查一个数组。如果它是一个数组,则为数组中的每个项递归调用它。
/**
* shortSource
*
* Returns an array of URLs with the www. removed from the front of the domain name.
*
* @param mixed $source Either a string or array
* @return mixed $sourceShortUrl An array of URLs or a single string
*/
protected function shortSource($source) {
if (is_array($source)) {
foreach ($source as $url) {
$sourceShortUrl[] = $this->shortSource($url);
}
} else {
$sourceShortUrl = str_ireplace('www.', '', parse_url($source, PHP_URL_HOST));
}
return $sourceShortUrl;
}
在这个递归函数中,它将解析单个字符串或字符串数组。
// in the view
if (is_array($sourceShortUrl)) {
foreach ($sourceShortUrl as $url) {
// view specific code for URL here
}
}