在一个+ cakephp条件下合并或组合两个数组



如何打印这个数组:

array
      0 => 
        array
          'Shift.name LIKE' => string '%Burberry%' (length=10)
      1 => 
        array
          'Shift.name LIKE' => string '%Butchery%' (length=10)

:

array 
  'Shift.name LIKE' => string '%Burberry%' (length=10)  
  'Shift.name LIKE' => string '%Butchery%' (length=10)

我写了些什么:

$skillAux =array(); $i=0;
foreach ($skillNames as $name){
                    $skillAux[$i] = array('Shift.name LIKE'=>'%'.$name.'%');
                    $i++;                
                }

数组键(索引)必须唯一

首先,(关联)中的'键'应该是唯一的,所以尝试实现这一点;

array (
  'Shift.name LIKE' => '%Burberry%'  
  'Shift.name LIKE' => '%Butchery%'
)

与尝试执行此操作相同;

$myArray = array();
$myArray['Shift.name LIKE'] = '%Burberry%';
$myArray['Shift.name LIKE'] = '%Butchery%';

换句话说,您正在覆盖 'Shift.name LIKE'键的前一个值,因此您最终将只得到最后一个值;

var_dump($myArray);
//The last value has overwritten the previous one, so you'll 
//only have 1 value in the array:
array(
    'Shift.name LIKE' string '%Butchery%' (length=10)
)

为CakePHP中的不同的字段创建'OR'条件

您可能会感到困惑,因为当为不同的字段创建'OR'条件时,您可以这样做;

$results = $this->Shift->find('all', array(
    'conditions' => array(
        'OR' => array(
            'Shift.name LIKE' => '%Burberry%',
            'Shift.something' => 'something',
        ),
    ),
));

这将执行类似;

SELECT * 
FROM shifts AS Shift
WHERE Shift.name LIKE '%Burberry%' OR Shift.something = 'something';

但是这个将不起作用如果你需要为相同的字段这样做(正如我的回答的第一部分所解释的)

为CakePHP中的单个字段创建'OR'条件

正如你在评论中提到的,你试图在CakePHP中为单个字段创建一个"或"条件。

基本上,你需要做的是创建多个关联数组并将它们包装在一个非关联数组中(实际上,这就是你在第一个例子中得到的)

这样的;

array(
    'OR' => array(
        array('Shift.name LIKE' => '%Burberry%'),
        array('Shift.name LIKE' => '%Butchery%'),
    )
)

可以这样使用;

$results = $this->Shift->find('all', array(
    'conditions' => array(
        'OR' => array(
            array('Shift.name LIKE' => '%Burberry%'),
            array('Shift.name LIKE' => '%Butchery%'),
        ),
        // other conditions can be put here
        // for example 'Shift.status' => 1
    ),
));

这将执行类似;

SELECT * 
FROM shifts AS Shift
WHERE Shift.name LIKE '%Burberry%' OR Shift.name LIKE '%Butchery%';

以编程方式创建这个数组;(我不得不在这里"猜测",你的问题不是很清楚那些'Burberry'和' butcher '的词是从哪里来的)

例如,有人想在你的数据库中搜索名字包含"Burberry"或"butcher"的"shift"。您从一个表单字段收集搜索查询,并使用这些单词创建一个'OR'查询;

// Search-term entered by the user
// for example, obtained via $search = $this->request->query['search'];
$search      = 'Burberry Butchery';
$keywords    = explode(' ', $search);
$conditions  = array();
foreach($keywords as $keyword) {
    $conditions[] = array(
        'Shift.name LIKE' => '%' . $keyword . '%'
    );
}
$results = $this->Shift->find('all', array(
    'conditions' => array(
        'OR' => $conditions
    ),
));

如果循环遍历其中一个数组,可以使用array_push()将每个值添加到另一个数组。

$skillAux=array();
$count=0;
foreach ($skillNames as $value){
    foreach($value as $finalkey => $finalvalue){
    echo $finalkey;
    $skillAux[$finalkey.$count] = $finalvalue;    
    }
    $count++;
}
var_dump($skillAux);exit();

试试这个

echo implode('<br>', $skillAux);

文档


implode函数将整个数组转换为字符串

语法

string implode ( string $glue , array $pieces )
string implode ( array $pieces )

第一个参数->用于将数组片段连接在一起的字符串。
第二个参数-> array

兼容PHP 4, PHP 5

参考:http://php.net/manual/en/function.implode.php

最新更新